Pourquoi je ne peux pas utiliser le protocole let in dans Swift?

J'ai un doute sur les protocoles en Swift sur l'utilisation de var et le mots clés { get set }.

À partir de documentation Apple :

Si un protocole nécessite qu'une propriété soit gettable et settable, cela l'exigence de propriété ne peut pas être remplie par une propriété stockée constante ou une propriété calculée en lecture seule. Si le protocole ne requiert qu'un propriété à être gettable, la condition peut être satisfaite par n'importe quelle sorte de la propriété, et il est valide pour que la propriété soit également configurable si ceci est utile pour votre propre code.

Les exigences de propriété sont toujours déclarées comme propriétés variables, préfixé avec le mot-clé var. Les propriétés gettable et settable sont indiqué en écrivant { get set } après leur déclaration de type, et les propriétés gettable sont indiquées en écrivant { get }.

Je ne comprends pas pourquoi je ne peux pas utiliser laissez - . Un var dans un protocole avec seulement get n'est pas seulement un laissez - ?

Quelque Chose comme ceci:

protocol someProtocol 
{
   var someProperty: String { get }
}

Ce ne serait pas juste:

protocol someProtocol 
{
   let someProperty: String
}

Il me manque quelque chose?

48
demandé sur Massimo Polimeni 2015-12-21 00:12:20

2 réponses

"Un var dans un protocole avec seulement obtenir n'est pas seulement un let?" non. Un let indique une constante. Mais ce n'est pas le cas ici. Considérez ce qui suit:

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"

Le protocole spécifie ce que la classe conforme montre à l'extérieur-une propriété de type String nommée somePropertyque vous pouvez au moins obtenir.

Si le protocole spécifie { get } votre classe peut choisir de se conformer via let someProperty: String = "", mais il peut également choisir de se conformer via le code ci-dessus. Si, d'autre part le protocole spécifie { get set } Vous ne pouvez pas utiliser let dans l'implémentation mais devez également le rendre paramétrable.

Un protocole ne peut tout simplement pas définir qu'une valeur doit être constante - pas plus que cela, c'est un détail d'implémentation qui doit être pris en charge (ou décidé) par la classe / structure qui l'implémente.

46
répondu luk2302 2015-12-20 21:26:26

, La différence est entre

protocol MyProtocol {
    let someProperty: String
}

, Qui n'a pas de sens - un protocole n'est pas censé dicter comment someProperty est défini/stocké, uniquement que, il est disponible en tant que propriété. Il peut s'agir d'une propriété calculée ou stockée, mais c'est à l'implémenteur de décider, pas au protocole lui-même.

Et

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
}

Ce qui est parfaitement autorisé!

30
répondu jtbandes 2015-12-20 21:27:27