layout: post
title: "May 04, 2021, TIL (Today I Learned) - Delegate Pattern, Protocol Adoption & Conformance"
summary: "iOS 커리어 스타터 캠프 2기"
author: inwoodev
date: '2021-05-04 22:35:23 +0530'
category: ['Swift_iOS', 'Protoocol', 'TIL']
thumbnail: /assets/img/posts/light-bulbs.jpg
keywords: ios, swift, delegate pattern, protocol, adoption, conformance
permalink: /blog/TIL(Today I Learned)/38
usemathjax: true
프로토콜을 채택(adopt)하는 것은 내가 선택한 클래스가 특정 프로토콜과 규약을 맺는 것이라고 보면 된다 (프로토콜에 속해있는 모든 것이 가능 해 지는 것이다.)
struct: Hamster: TextRepresentable {
// code...
}
프로토콜을 준수(conform) 하는 것은 특정한 타입(class, struct...)이 커스텀 프로토콜을 만들기 전 이미 해당 프로토콜의 요구 조건을 구현 한 상태라면 내가 생성한 타입의 extension
에 타입이름과 프로토콜의 이름만 명시하고, 구현 부를 공백으로 두게 되면 이 프로토콜을 준수하게 되는 것이다.
struct Hamster {
var name: String
var textualDescription: String {
return "A hamster named \(name)"
}
}
extension Hamster: TextRepresentable {}
https://docs.swift.org/swift-book/LanguageGuide/Protocols.html#ID278
코드를 읽게 쉽게 해 준다.
결합도(coupling) ↓↓↓
코드의 재사용성 ↑↑↑
localbanktask 커밋 참고
final class LocalBankTask: Operation {
let waitingNumber: UInt
let creditRate: CreditRating
let workType: WorkType
init(_ number: UInt) {
guard let credit = CreditRating.allCases.shuffled().first,
let work = WorkType.allCases.shuffled().first else {
fatalError()
}
self.waitingNumber = number
self.creditRate = credit
self.workType = work
}
}
기존 방식
final class LocalBankTask: Operation {
let waitingNumber: UInt
let creditRate: CreditRating
let workType: WorkType
init?(_ number: UInt) {
guard let credit = CreditRating.allCases.shuffled().first,
let work = WorkType.allCases.shuffled().first else {
return nil
}
self.waitingNumber = number
self.creditRate = credit
self.workType = work
}
}
실패할 수 있는 이니셜라이저 채택.
이니셜라이저를 실패했을 경우 fatalError()를 뱉어내는 것이 아니라 애초에 실패할 수 있는 이니셜라이저를 채택하여 사용하는 것이 앱이 터지는 것을 방지하는 safe한 방법이라는 것을 깨달아서 적용해 보았습니다.~
출처:
The Delegate Pattern In Swift - Dillon McElhinney
Delegation in Swift - Swift by Sundell