Program Club

Swift에서 let in protocol을 사용할 수없는 이유는 무엇입니까?

proclub 2020. 12. 8. 20:12
반응형

Swift에서 let in protocol을 사용할 수없는 이유는 무엇입니까?


var키워드 {get set} 사용에 대한 Swift의 프로토콜에 대해 의문이 있습니다 .

에서 애플 문서 :

프로토콜에서 속성을 가져오고 설정할 수 있어야하는 경우 해당 속성 요구 사항은 상수 저장 속성 또는 읽기 전용 계산 속성으로 충족 될 수 없습니다. 프로토콜이 속성 만 가져 오도록 요구하는 경우 모든 종류의 속성으로 요구 사항을 충족 할 수 있으며, 이것이 자신의 코드에 유용 할 경우 속성을 설정할 수있는 것도 유효합니다.

속성 요구 사항은 항상 var 키워드로 시작하는 변수 속성으로 선언됩니다. Gettable 및 settable 속성은 유형 선언 후에 {get set}을 작성하여 표시하고 gettable 속성은 {get}을 작성하여 표시합니다.

let을 사용할 수없는 이유를 이해할 수 없습니다 . get 만 사용하는 프로토콜 varlet a가 아닙니다 .

이 같은:

protocol someProtocol 
{
   var someProperty: String { get }
}

그것은 단지 다음이 아닙니다.

protocol someProtocol 
{
   let someProperty: String
}

내가 뭔가 빠졌나요?


"get 만있는 프로토콜의 var는 그냥 let이 아닙니까?" A let는 상수를 나타냅니다. 그러나 여기서는 그렇지 않습니다. 다음을 고려하세요:

protocol SomeProtocol {
    var someProperty: String { get }
}

class SomeClass : SomeProtocol {

    var someProperty: String = ""

    func cla () {
        someProperty = "asd"
    }
}

let someInstance = SomeClass()

print(someInstance.someProperty) // outputs ""
someInstance.cla()
print(someInstance.someProperty) // outputs "asd"

프로토콜은 준수하는 클래스가 외부에 표시하는 것을 지정합니다 . 최소한 얻을 있는String 이름 someProperty지정된 유형의 일부 속성입니다 .

프로토콜이 지정하면 { get }클래스가 준수 let someProperty: String = ""하도록 선택할 수 있지만 유사하게 위 코드를 통해 준수하도록 선택할 수 있습니다. 반면에 프로토콜 이 구현에서 { get set }사용할 수 없지만 let설정 가능하게 만들어야한다고 지정하는 경우.

프로토콜은 값이 상수 여야한다는 것을 정의 할 수 없습니다. 또한 값을 구현하는 클래스 / 구조체에 의해주의 (또는 결정)되어야하는 구현 세부 사항이 아니어야합니다.


차이점은

protocol MyProtocol {
    let someProperty: String
}

which makes no sense — a protocol isn't supposed to dictate how someProperty is defined/stored, only that it's available as a property. It could be either a computed or stored property, but that's for the implementer to decide, not the protocol itself.

and

protocol MyProtocol {
    var someProperty: String { get }  // abstract interface
}

struct MyStruct: MyProtocol {
    let someProperty: String  // concrete implementation: stored property
}

struct OtherStruct: MyProtocol {
    let i: Int
    var someProperty: String { return "\(i)" }  // concrete implementation: computed property
}

which is perfectly allowed!

참고URL : https://stackoverflow.com/questions/34385897/why-i-cant-use-let-in-protocol-in-swift

반응형