Swift中协议的只读属性

时间:2015-07-11 15:04:09

标签: swift

从“学习Swift的基本知识”游乐场,有一个示例协议:

protocol ExampleProtocol {
    var simpleDescription: String { get }
    func adjust()
}

这个例子之后有一段短文写着:

  

注意:simpleDescription属性后面的{get}表示它是只读的,这意味着可以查看属性的值,但永远不会更改。

此外,还给出了符合此协议的类的示例:

class SimpleClass: ExampleProtocol {
    var simpleDescription: String = "A very simple class."
    var anotherProperty: Int = 69105
    func adjust() {
        simpleDescription += "  Now 100% adjusted."
    }
}

var a = SimpleClass()
a.adjust()
let aDescription = a.simpleDescription

但是这个类如何符合协议?什么阻止我改变simpleDescription?我不懂什么?

Playground screenshot

3 个答案:

答案 0 :(得分:11)

无法在协议中指定您必须具有只读 属性。您的协议要求simpleDescription属性,允许,但不需要设置器。

另请注意,您可能会改变simpleDescription的唯一原因是因为您知道a类型为SimpleClass。如果我们有ExampleProtocol类型的变量而不是......

var a: ExampleProtocol = SimpleClass()
a.simpleDescription = "newValue" //Not allowed!

答案 1 :(得分:3)

协议将要求放在对象的接口上,但不限制实现提供比这更多的操作。

在此示例中,协议需要可读的simpleDescription属性和adjust()方法。该类提供了,因此它符合协议。换句话说,该协议表示实现必须具有get操作,但它并不禁止它们具有set

您将无法通过该协议接口变异simpleDescription,因为它不提供此类操作,但没有任何东西阻止您通过不同的接口进行变更 - 在此示例中,实施类的接口。

答案 2 :(得分:0)

发现这一点,并认为除了已经提供的优秀答案之外,它可能会引起人们的兴趣:

  

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

摘自:Apple Inc.“Swift编程语言(Swift 2.2)。”iBooks。 https://itun.es/us/jEUH0.l