2014-07-22 16 views
31

Swift fornisce la parola is (e as?) per verificare se un oggetto può essere abbattuto con successo:C'è una differenza tra "è" e isKindOfClass()?

if foo is MyClass { 
    // ... 
} 

Ma NSObjectProtocol offre anche l'originale func isKindOfClass(aClass: AnyClass!) -> Bool:

if something.isKindOfClass(MyClass) { 
    // ... 
} 

Per le classi conformi alla NSObjectProtocol, è questo è davvero molto diverso?

+0

Penso che la differenza principale è 'come?'/'Is' lavora per oggetto/struct che non conforme a' NSObjectProtocol'. –

risposta

44

c'è una differenza: is funziona con qualsiasi classe a Swift, mentre isKindOfClass() funziona solo con quelle classi che sono sottoclassi di NSObject o in altro modo implementano NSObjectProtocol.

+0

Penso che OP stia davvero chiedendo di 'is' invece di' as? ' –

+0

Doh - la domanda originariamente specificata' as? ', Ma sembra essere stata modificata. Risolverò la mia risposta. – Caleb

+0

Scusate per la modifica improvvisa - mi sono reso conto che 'is' è più vicino a' isKindOfClass' di 'as?' :) – jtbandes

9

Alcune differenze:

  • is opere su tipi non-classe. isKindOfClass: funziona solo sugli oggetti per verificare se sono un'istanza di una classe
  • Come già menzionato da altri, isKindOfClass: è dichiarato su NSObjectProtocol, quindi non consente di utilizzarlo su espressioni che non sono note per il protocollo , eccetto lo AnyObject. In realtà, le classi Swift native anche (non ufficialmente) sono conformi alle NSObjectProtocol, quindi se li lanci a AnyObject, è comunque possibile utilizzare isKindOfClass: (something as AnyObject).isKindOfClass(MyClass)
  • is funziona anche per controllare contro i protocolli, mentre l'equivalente in termini di NSObjectProtocol metodi sarebbe conformsToProtocol:
  • is accetta un tipo che deve essere hardcoded in fase di compilazione. isKindOfClass: accetta un'espressione il cui valore può essere calcolato in fase di esecuzione. Non conosco un modo per verificare se un oggetto è un'istanza di una classe (incluse le sottoclassi) che viene calcolata in fase di esecuzione utilizzando solo la libreria standard Swift.
6

in Objective-C, si utilizza l'isKindOfClass: metodo per verificare se un oggetto è di un certo tipo di classe, e il conformsToProtocol: metodo per verificare se un oggetto è conforme a un protocollo specifico. In Swift, esegui questo compito utilizzando l'operatore is per verificare un tipo o il come? operatore a downcast per quel tipo.

È possibile verificare se un'istanza è di un determinato tipo di sottoclasse utilizzando l'operatore is. L'operatore is restituisce true se l'istanza è di quel tipo di sottoclasse e false se non lo è.

SWIFT

if object is UIButton { 
    // object is of type UIButton 
} else { 
    // object is not of type UIButton 
} 

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html

Problemi correlati