为什么我不能在Swift中使用let in protocol?

Mas*_*eni 59 protocols getter-setter ios swift swift-protocols

我对Swift中有关var的使用和关键字{get set}的协议有疑问.

来自Apple文档:

如果协议要求属性可获取和可设置,则不能通过常量存储属性或只读计算属性来满足该属性要求.如果协议只要求属性可以获取,那么任何类型的属性都可以满足要求,如果这对您自己的代码有用,则该属性也可以设置.

属性要求始终声明为变量属性,前缀为var关键字.Gettable和settable属性通过在类型声明后写入{get set}来指示,并且通过编写{get}来指示gettable属性.

我无法理解为什么我不能使用let.只有get的协议中的var不只是一个let

像这样的东西:

protocol someProtocol 
{
   var someProperty: String { get }
}
Run Code Online (Sandbox Code Playgroud)

它不会只是:

protocol someProtocol 
{
   let someProperty: String
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

luk*_*302 54

"只有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"
Run Code Online (Sandbox Code Playgroud)

该协议规定了哪些符合类显示到外-类型的某些属性String命名someProperty,你可以至少获得.

如果协议指定{ get }您的类可以选择符合通过,let someProperty: String = ""但它可以类似地选择通过上面的代码符合.另一方面,如果协议指定{ get set }您不能let在实现中使用,但必须使其也可以设置.

协议根本无法定义一个值必须是常量 - 它也不应该是一个实现细节,它必须由实现它的类/结构来处理(或决定).

  • _协议根本无法定义一个值必须是常量——它也不应该_为什么不呢?为什么 Apple 不提供更多粒度并允许同时定义 let 和 var 属性?或者你是说虽然 Apple 可以选择我所说的,但他们选择了在实施级别提供的灵活性 (3认同)

jtb*_*des 37

区别在于

protocol MyProtocol {
    let someProperty: String
}
Run Code Online (Sandbox Code Playgroud)

这是没有意义的-的协议是不应该决定如何 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
}
Run Code Online (Sandbox Code Playgroud)

这是完全允许的!

  • _协议不应该规定`someProperty`是如何定义/存储的_协议是否定义了变量名称/类型/是否必须设置?为什么 Apple 不提供更多粒度并允许同时定义 let 和 var 属性? (3认同)