2015-07-11 74 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