(1/6)
<aside> 💡 프로토콜 자체에서는 값을 정의하지 않음 이 값을 정의해야한다 ! 라는 약속을 적어두는 것
</aside>
원래 프로토콜 안에 적어둔 프로퍼티나 함수는 모두 선언해야 하지만,
그렇지 않은 애들도 있다면 ? optional 로 선언해두기 !
단, @objc 도 함께 붙여줘야 함
***@objc*** protocol SomeProtocol: **AnyObject** {
var this: String { get set }
var that: String { get set }
***@objc*** var these: String { get set }
}
하지만, 이런 프로토콜의 경우, 오로지 Class 에서만 채택할 수 있음
→ 이 때문에 AnyObject 가 붙어야 함
(2/6)
프로토콜을 채택하여 구현하는 프로퍼티의 경우, 연산 프로퍼티, 저장 프로퍼티 상관 없음 !
class ASomething: SomeProtocol {
var this: String = "this"
var that: String {
return "that"
}
}
프로토콜에서의 연산 프로퍼티는 항상 var 로 구현해야 한다 !
protocol SomeProtocol {
var this: String { get set }
}
이에 대한 이유로는, 프로토콜을 채택하는 부분에서 해당 프로퍼티를 정의해주어야 하는데,
연산 프로퍼티가 let 이라면 변경시킬 수 없으니까 !
애초부터 연산 프로퍼티는 let 으로 선언할 수 없었던 것처럼 !
하지만, 저장 프로퍼티라면 let 을 사용할 수도 있다
해당 프로퍼티의 { get set } 에 따라 달라짐
아래처럼 { get } 으로 설정해 둔 경우
→ let / var 모두 가능
protocol SomeProtocol {
var this: String { get }
var that: String { get }
}
class ASomething: SomeProtocol {
let this: String = "this"
var that: String = "that"
}
연산 프로퍼티로도 구현 가능 !
class BSomething: SomeProtocol {
var this: String {
get {
return "this"
}
set {
self.other = newValue
}
}
var that: String = "that"
}
{ get set } 으로 설정해 둔 경우
protocol SomeProtocol {
var this: String { get set }
var that: String { get set }
}
무조건 var 로 선언해야 함
class ASomething: SomeProtocol {
let this: String = "this" // 컴파일 오류 발생
var that: String = "that"
}
연산 프로퍼티의 경우에는, getter 와 setter 두 제공해야 함
class BSomething: SomeProtocol {
var this: String {
get {
return "this"
}
set {
self.other = newValue
}
}
var that: String { // 컴파일 에러 발생 -> setter 도 설정해야 함
get {
return "that"
}
}
}
헤더 부분(private func someFunc() ) 만 선언해두기!
이 때, 구조체에서 사용할 프로토콜이고, 메소드가 구조체의 프로퍼티를 변경하는 놈이라면,
mutating 을 붙여주어야 함 !
protocol SomeProtocol {
var this: String { get set }
mutating func someFunc()
}
struct Something: SomeProtocol {
var this: String = "this"
mutating func someFunc() {
self.this = "other this"
}
}
프로토콜에 mutating 이 붙어있는 경우, 사용하는 부분에도 mutating 을 붙여줘야 함