protocol A : class { ... }
definisce un "class-only protocol": solo i tipi di classe (e non strutture o enumerazioni) può adottare questo protocollo.
I riferimenti deboli sono definiti solo per i tipi di riferimento . Le classi sono tipi di riferimento, le strutture e le enumerazioni sono tipi di valore. (Le chiusure sono anche tipi di riferimento, ma le chiusure non possono adottare un protocollo , quindi sono irrilevanti in questo contesto.) Pertanto, se il protocollo definisce una proprietà debole, il protocollo deve essere un protocollo di classe .
Ecco un altro esempio che richiede un protocollo di classe sola:
protocol A {
var name : String { get set }
}
func foo(a : A) {
a.name = "bar" // error: cannot assign to property: 'a' is a 'let' constant
}
Questo non viene compilato perché per le istanze di strutture ed enumerazioni, a.name = "bar"
è una mutazione di a
. Se si definisce il protocollo come
protocol A : class {
var name : String { get set }
}
il compilatore sa che a
è un'istanza di un tipo di classe a quella a
è un riferimento alla memorizzazione degli oggetti, e a.name = "bar"
modifica l'oggetto di riferimento, ma non a
.
Quindi, in generale, è necessario definire un protocollo di solo classe se è necessario i tipi che adottano il protocollo come tipi di riferimento e non di valori.
fonte
2015-11-02 06:34:48
Nel tuo esempio di codice hai detto che '' a 'è una costante' let '. Sono un po 'confuso. Ciò che rende 'a' una costante qui? – Suragch
@Suragch: i parametri di funzione - come 'a' in' func foo (a: A) '- sono di default * costanti *. –