transportation español apple ios swift swift2

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)