Facciamo vedere il problema sulle dichiarazioni:
L'operatore ===
è dichiarato per AnyObject
.
public func ===(lhs: AnyObject?, rhs: AnyObject?) -> Bool
Che cosa è esattamente AnyObject
? AnyObject
è un protocollo a cui tutte le classi si conformano automaticamente.
In Swift, non ci sono solo tipi di classe, ci sono anche tipi di valore, per esempio le strutture e le enumerazioni. Tutti possono essere conformi ai protocolli, ma le strutture e le enumerazioni non sono conformi allo standard AnyObject
. Dato che hai uno sfondo Java, il comportamento dei tipi di valore è simile ai tipi primitivi in Java: vengono passati per valore (copia) e di solito non si ottiene un riferimento.
Quando si dichiara un protocollo, il compilatore non sa se verrà adottato da classi o strutture.
protocol X {}
struct A: X {}
let x1: X = A()
let x2: X = A()
// PROBLEM - we cannot compare two structs by ===
if x1 === x2 {
}
Ciò significa che dobbiamo dire al compilatore che il protocollo possa essere adottato solo per classi:
protocol X: AnyObject {}
o
protocol X: class {}
Poi
class A: X {} // can be adopted only by classes
let x1: X = A()
let x2: X = A()
// NO problem
if x1 === x2 {
}
Sono questi classe protocolli? '===' funzionerà solo sui tipi di classe, non sui tipi di valore (structs, enum). Se il protocollo non è dichiarato come protocollo di classe, non funzionerà perché il compilatore non può sapere che stai confrontando le classi e non le strutture. – Sulthan
@Sulthan Buon punto. Ma alla fine non tutti i protocolli saranno conformi a una classe? –
No, poiché le strutture, ad esempio, possono essere conformi anche ai protocolli – luk2302