iOS

Protocol에서 Optional 선언

삼쓰 웅쓰 2020. 3. 4. 16:06
728x90

protocol에서 optioanl 을 사용하면 다음과 같은 오류를 만나게 됩니다.

'optional' can only be applied to members of an @objc protocol

Swift document를 보면,

Swift는 optional을 사용하려면 반드시 @objc 를 붙여주라고 하고 있네요, 
class는 Objective-C 를 상속받거나 @objc가 붙은 클래스에서만 사용이 가능하니 당연히 struct나 enum에서는 사용할 수 없겠죠?

swift는 protocol에서 optioanl을 지원하지 않으니,
대신 @objc 를 지원하는 @objc 를 사용하는 것이 가장 쉬운 방법이 되겠습니다.

@objc protocol CounterDataSource {
    @objc optional func increment(forCount count: Int) -> Int
    @objc optional var fixedIncrement: Int { get }
}

이런식으로 사용하면 되겠군요 :)

 

하지만 꼭 순수 Swift 문법을 사용하고 싶다면, protocol을 extension해서 비어있는 함수를 구현을 해주는 방법이 있습니다.

protocl MyProtocol: class {
    func myFunc()
}

extension MyProtocol {
    func myFunc() {
    	...
    }
}

다음과 같이 한다면 MyProtocol을 상속할 때 꼭 myFunc을 구현해주지 않아도 된답니다.

 

감사합니다 :)