// 선택적 요구사항
// 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?()