ios - español - ¿Es Float, Double, Int un AnyObject?
swift transportation (2)
¡Buen descubrimiento! UIKit
realidad los convierte a NSNumber
, también mencionado por @vacawama. El motivo de esto es que, a veces, se está trabajando con un código que devuelve o utiliza AnyObject
, este objeto podría ser convertido ( as!
) Como un Int
u otra "estructura".
Leí la documentación en línea de Swift y estoy un poco confundido.
1) Any
es un protocolo que todos los tipos conforman implícitamente.
2) AnyObject
es un protocolo al que todas las clases se conforman implícitamente.
3) Int
, Float
, Double
son estructuras
Aquí hay un código de ejemplo:
import UIKit
func passAnyObject(param: AnyObject) {
print(param)
}
class MyClass {}
struct MyStruct {}
let a: Int = 1
let b = 2.0
let c = NSObject()
let d = MyClass()
let e = MyStruct()
passAnyObject(a)
passAnyObject(b)
passAnyObject(c)
passAnyObject(d)
//passAnyObject(e) // Argument type ''MyStruct'' does not conform to expected type ''AnyObject''
if a is AnyObject { // b, d, e is also AnyObject
print("/(a.dynamicType) is AnyObject")
}
Lo que no entiendo es por qué Int
, Double
, Float
are AnyObject
s? ¿Por qué el compilador no dice nada? Esos tipos se declaran como estructuras. Struct MyStruct
no se puede pasar al método en la parte superior porque no se ajusta a AnyObject
.
¿Podría ayudarme a entender por qué Int
, Double
y Float
son AnyObject
o por qué el compilador piensa que lo son?
Debido a que ha importado Foundation, Int
, Double
y Float
se convierten a NSNumber
cuando se pasan a una función que toma un AnyObject
. Tipo String
se convierte en NSString
. Esto se hace para hacer la vida más fácil al llamar a las interfaces basadas en Cocoa y Cocoa Touch . Si elimina la import UIKit
(o import Cocoa
para OS X), verá:
error: argument type ''Int'' does not conform to expected type ''AnyObject''
cuando usted llama
passAnyObject(a)
Esta conversión implícita de tipos de valor a objetos se describe here.
Actualización para Swift 3 (Xcode 8 beta 6):
Pasar un Int
, Double
, String
o Bool
a un parámetro de tipo AnyObject
ahora genera un error, como que el argumento de tipo ''Int'' no se ajusta al tipo esperado ''AnyObject'' .
Con Swift 3, se ha eliminado la conversión de tipo implícita. Ahora es necesario lanzar Int
, Double
, String
y Bool
con as AnyObject
para pasarlo a un parámetro de tipo AnyObject
:
let a = 1
passAnyObject(a as AnyObject)