swift

swift - Protocols #8 (Optional Protocol Requiredments)

행복하게사는게꿈 2021. 1. 12. 19:17

// 선택적 요구사항
// Optional 이라는 용어 -> optional 형식을 의미하는 것이 아니라 단어 그대로 선택적이라는 의미로 사용한다.

// 이걸 Optinal로 바꾸면
//protocol Drawable {
//   var strokeWidth: Double { get set }
//   var strokeColor: UIColor { get set }
//   func draw()
//   func reset()
//}

// 이런 프로토콜은 class 전용이다 -> struct이나 enum에서는 불가능
// 이전에 AnyObject로 선언하면 class전용이 된다고 말했는데 @objc optional을 하면 AnyObject가 자동으로 채용된다.
@objc protocol Drawable {
    @objc optional var strokeWidth: Double { get set }
    @objc optional var strokeColor: UIColor { get set }
    func draw()
    @objc optional func reset()
}

class Rectangle: Drawable {
    func draw() {
        
    }
}

let r: Drawable = Rectangle()
r.draw()

// 선택적 멤버에 접근할경우 optional chaining이 필요하다.
// 선택적 멤버로 선언했다면 optional형식이 되기 때문에
// 왜? 선택적 멤버는 형식에 포함되지 않을 수도 있는데 그러면 Optional형식으로 대체된다.
r.strokeWidth
r.strokeColor

// 선택적 메소드는 선택적 속성과 마찬가지로 optional로 선언되기 때문에 ?를 붙여줘야한다.
r.reset?()