2016-06-08 9 views
8

Ho una semplice domanda: Perché Bool si qualificano come AnyObject Secondo la documentazione di Apple:Perché Bool "AnyObject" invece di "Any"?

Allora perché fa passare questa affermazione?

let bool = true 
let explicitBool: Bool = true 

if (bool is AnyObject){ 
    print("I'm an object") 
} 

if (explicitBool is AnyObject){ 
    print("I'm still an object!") 
} 

+0

Per quanto mi riguarda, ho un avvertimento che "' è 'test è sempre vero", assumendo il collegamento implicito ai tipi Objective-C. – JAL

risposta

7

Perché è di essere colmato a un'istanza NSNumber.

Swift collega automaticamente determinati tipi di numeri nativi, ad esempio Int e Float, a NSNumber. - Using Swift with Cocoa and Objective-C (Swift 2.2) - Numbers

Prova questa:

let test = bool as AnyObject 
print(String(test.dynamicType)) 
+2

Pensavo che la Fondazione dovesse essere importata perché funzioni? – Hamish

+0

@ originaluser2 Anche io, ecco perché trovo questo più curioso. Non sono vicino a un Mac per essere in grado di testare questo però. Ti dispiacerebbe eseguire il codice OP + quel codice che ho incollato? – Alexander

+0

Hmm ... sembra essere un'eccezione magica per i campi da gioco. Quando è in campo, stampa '_NSCFBoolean' per il tipo dinamico con o senza importazione di base - sebbene non ti permetta di dire' come AnyObject', devi usare un downcast condizionale o forzato. Quando in un progetto reale funziona come previsto (collegato a NSNumber con importazione di base, impossibile eseguire il bridge senza). Più curioso – Hamish

4

Questo comportamento è dovuto al runtime Playground colmare per Objective-C/Cocoa API dietro le quinte. Swift versione 3.0-dev (LLVM 8fcf602916, Clang cf0a734990, Swift 000d413a62) su Linux non riproduce questo comportamento, con o senza Fondazione importati

let someBool = true 
let someExplicitBool: Bool = true 

print(someBool.dynamicType) // Bool 
print(someExplicitBool.dynamicType) // Bool 

print(someBool is AnyObject) // false 
print(someExplicitBool is AnyObject) // fase 

Try it online.

+0

Si tratta di un bug? Non posso dirlo a – Alexander

+0

@AMomchilov Non penso.Penso che questo si verifichi solo su Mac a causa del bridging implicito di 'Bool' a' ObjCBool' e 'NSNumber'. – JAL

Problemi correlati