从“学习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
?我不懂什么?
答案 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