2015-11-02 12 views

risposta

32
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.

+0

Nel tuo esempio di codice hai detto che '' a 'è una costante' let '. Sono un po 'confuso. Ciò che rende 'a' una costante qui? – Suragch

+0

@Suragch: i parametri di funzione - come 'a' in' func foo (a: A) '- sono di default * costanti *. –

Problemi correlati