2015-07-11 90 views
4

从“学习斯威夫特纲要”操场上,有一个例子协议:只读协议的特性在雨燕

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

回答

9

有没有办法,你必须有一个只读财产协议来指定。您的协议要求simpleDescription属性,并且允许,但不要求要求设置人员。

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

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

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

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

您将无法通过该协议接口变异simpleDescription,因为它并没有提供这样的操作,但没有阻止你通过不同接口变异它 - 在这个例子中,实现类的接口。

0

发现这一点,并认为这可能有兴趣,除了已经提供的出色答卷:

如果协议要求必须gettable和可设置的属性,该属性要求不能被存储在一个恒定的实现属性或只读计算属性。如果协议只需要一个属性为可获取的,那么可以通过任何类型的属性满足该需求,并且如果该属性对您自己的代码有用,则该属性也可以设置。

摘录自:苹果公司“Swift编程语言(Swift 2.2)。”iBooks。 https://itun.es/us/jEUH0.l