codememo

왜 스위프트에서 레트인 프로토콜을 사용할 수 없습니까?

tipmemo 2023. 8. 26. 11:55
반응형

왜 스위프트에서 레트인 프로토콜을 사용할 수 없습니까?

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

Apple 설명서에서:

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

속성 요구 사항은 항상 var 키워드 앞에 변수 속성으로 선언됩니다.gettable 및 settable 속성은 해당 유형 선언 뒤에 {getset}을(를) 입력하여 나타내고 gettable 속성은 {get}을(를) 입력하여 나타냅니다.

나는 왜 렛을 사용할 수 없는지 이해할 수 없습니다.get만 있는 프로토콜의 var는 그냥 렛이 아닌가요?

이와 같은 것:

protocol someProtocol 
{
   var someProperty: String { get }
}

그것은 단순한 것이 아닙니다.

protocol someProtocol 
{
   let someProperty: String
}

내가 뭔가를 놓쳤다고요?

"get만 있는 프로토콜의 var는 그냥 셋이 아닙니다."아니요. Alet상수를 나타냅니다.하지만 여기서는 그렇지 않습니다.다음 사항을 고려합니다.

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
}

말이 안 돼요. 프로토콜은 어떻게 지시하지 않습니다. someProperty속성으로 사용할 수 있다는 것만 정의/제한됩니다.계산된 속성이거나 저장된 속성일 수 있지만, 이는 구현자가 결정하는 것이지 프로토콜 자체가 아닙니다.

그리고.

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
}

그것은 완벽하게 허용됩니다!

저는 프로토콜이 구조물에 무언가가 있어야 한다고 요구할 수 있지만 구조물이나 객체의 기능을 제한할 수는 없다고 생각합니다.그렇다고 해서 코드에서 수행하고 싶은 작업을 수행하는 것을 방해하지는 않습니다. 예를 들어,var과 의서에그a에서.let구현이 허용 가능하기 때문입니다.

protocol MyProtocol {
    var trythis: Int { get }
}

struct MyStructure: MyProtocol {
    let trythis: Int
}

다으로선속으로 let는 됨려로 됩니다.read-only을 읽기 전용으로설정하여 해야 할 수 .이러한 이유로 프로토콜에서는 속성을 읽기 전용으로 설정하여 속성을 상수로 지정해야 할 수 있습니다.이 공제는 다음 중 일부를 사용하여 확인할 수 있습니다.Objc 함수들 property_getAttributes.

protocol SomeProtocol {
    var someTypeProperty: Int { get }
}

struct Foo: SomeProtocol {
    let someTypeProperty: Int
}

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

반응형