TIL 0111 - 프로토콜 선택적 요구사항, 확장

ian·2022년 1월 11일
0

TIL

목록 보기
8/11
post-thumbnail

아웅 넘 추워 다들 따뜻하게 입으십셔 ..


옛날에 어트리뷰트 공부했었음! 기억난다 기억나!
어트리뷰트 는 컴파일러에게

  • 선언에 대한 추가정보 제공
  • 타입에 대한 추가정보 제공

을 제공합니다!

@available(iOS 10.0, macOS 10.12, *)
class SomeType {      // "SomeType" 선언은 iOS 10.0 버전이상에서만 읽을 수 있음
    
}

만약! 프로토콜을 구현을 했는데 구현하고 싶지 않은 프로퍼티나, 매서드가 있다면 어떻게하면 좋을까?

바로 이렇게 구현할 수 있다!

@objc protocol Remote {
    @objc optional var isOn: Bool { get set }
    func turnOn()
    func turnOff()
    @objc optional func doNeflix()
}


class TV: Remote {
    var isOn = false
    func turnOn() {}
    func turnOff() {}
}

우리가 앞전에 확장을 배웠을 때..
사실 프로토콜도 확장이 된다는 사실!?

만약에.. 밑과 같은 코드가 있다면..

protocol Remote {
    func turnOn()
    func turnOff()
}

class TV1: Remote {
    func turnOn() { print("리모콘 켜기") }
    func turnOff() { print("리모콘 끄기") }
}

struct Aircon1: Remote {
    func turnOn() { print("리모콘 켜기") }
    func turnOff() { print("리모콘 끄기") }
}

{ print("리모콘 끄기") } 가 반복적으로 구현되고 있으니! 이걸 축약해 줄 수는 없을까?

아 있죵ㅋ

바로 밑처럼 구현하면 됩니다ㅋㅎ

protocol Remote {
    func turnOn()
    func turnOff()
}

extension Remote {                         
    func turnOn() { print("리모콘 켜기") }   
    func turnOff() { print("리모콘 끄기") }   
    
    func doAnotherAction() {             
        print("리모콘 또 다른 동작")           
    }
}

class TV1: Remote {
 
}

struct Aircon1: Remote {

}

let tv: TV1 =TV1()
tv.turnOn // 리모콘 켜기
tv.turnOff // 리모콘 끄기

let aircon: Aircon1 = Aircon1()
aircon.turnOn // 리모콘 켜기
aircon.turnOff // 리모콘 끄기

과 같은 식으로! 확장을 할 수도 있습니다!

예전부터 헷갈린게 제 머리속으론 정리가 돼서 기쁘네요!


학습 키워드

  • 프로토콜 선택적 요구사항
  • 프로토콜 확장

문제점 / 고민한 점

  • 프로토콜을 실습으로 활용해보지 않아서 실습에선 어떻게 할 지 궁금하네.. 곧 찾아봐야겠다

TIL 시리즈는 막연히 제가 배운 걸 기록하는 공간입니다.


출처:
앨런 swift 문법 마스터 스쿨

profile
디자인씽킹을 하며 iOS 를 공부합니다

0개의 댓글