(1/6)

프로토콜이란 ?

<aside> 💡 프로토콜 자체에서는 값을 정의하지 않음 이 값을 정의해야한다 ! 라는 약속을 적어두는 것

</aside>

옵셔널 가능 ? objc 가능 ?

원래 프로토콜 안에 적어둔 프로퍼티나 함수는 모두 선언해야 하지만, 그렇지 않은 애들도 있다면 ? 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"
}

연산 프로퍼티의 경우에는, gettersetter 두 제공해야 함

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 을 붙여줘야 함