May 04, 2021, TIL (Today I Learned)

Inwoo Hwang·2021년 8월 26일
0
post-thumbnail

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


학습내용


Screen Shot 2021-05-04 at 10.46.25 AM

궁금증1 Protocol 준수와 채택의 차이는 정확히 뭐지?

프로토콜을 채택(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

궁금증 2: Delegate pattern과 객체간 통신

Delegation을 왜 사용하는가?

  • 코드를 읽게 쉽게 해 준다.

  • 결합도(coupling) ↓↓↓

    • 클래스간의 결합도를 프로토콜을 통해 낮춰줄 수 있다.
    • 각 클래스간의 분리하여 디버깅이 가능해 진다.
  • 코드의 재사용성 ↑↑↑

궁금증 3: initializer 안에서 guard let과 if let

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

profile
james, the enthusiastic developer

0개의 댓글