ios - AnyObject no funciona en Xcode8 beta6?
swift swift3 (2)
Larga historia corta.
Para verificar si el valor tiene un tipo de referencia:
if type(of: value) is AnyClass {
// ...
}
Para verificar si el tipo es un tipo de referencia:
if SomeType.self is AnyClass {
// ...
}
Más respuestas útiles:
- https://stackoverflow.com/a/39185374/746347
- https://stackoverflow.com/a/39546887/746347
En Xcode8 beta6, el siguiente código provocará una advertencia: la prueba ''es'' siempre es verdadera. Pero no imprimirá el pase.
struct TestStruct {
}
//warning: ''is'' test is always true
if TestStruct() is AnyObject {
print("pass")
}
Y el siguiente código causará una advertencia: el lanzamiento condicional de ''T'' a ''AnyObject'' siempre tiene éxito
public static func register<T>(_ protocolType: T.Type, observer: T) {
//Warning: Conditional cast from ''T'' to ''AnyObject'' always succeeds
guard let object = observer as? AnyObject else {
fatalError("expecting reference type but found value type: /(observer)")
}
//...
}
La advertencia funciona como TestStruct() is AnyObject
: el false
retorno de TestStruct() is AnyObject
, sin embargo, no
La versión anterior de esta respuesta percibió la advertencia,
''es'' la prueba es siempre cierta
como el error, y contenía algunas discusiones sobre por qué se percibiría esta advertencia percibida de errores. Ese TestStruct() is AnyObject
evaluado a false
en el tiempo de ejecución, sin embargo, se percibió como el comportamiento esperado.
Teniendo en cuenta los comentarios al informe de error presentado por el OP (SR-2420) , parece que la situación es al revés: desde Xcode 8 / beta 6, la prueba is
siempre se evalúa como true
, y el error de la OP es la publicación. el hecho de que TestStruct() is AnyObject
evalúa como false
durante el tiempo de ejecución.
Esto es correcto, porque todo se
AnyObject
aAnyObject
ahora....
is
/as
AnyObject
siempre tiene éxito para todos los tipos ahora. Se está comportando como debería.
El nuevo cuadro de SwiftValue
para la conversión de valores de Swift a objetos de Obj-C
(para detalles adicionales, vea la discusión en los comentarios a continuación, gracias @MartinR)
Parece como si los valores Swift que no están explícitamente implementados para ser puenteables a objetos Obj-C a través de, por ejemplo, conformidad con _ObjectiveCBridgeable
(ver por ejemplo las siguientes preguntas y respuestas para detalles sobre _ObjectiveCBridgeable
), automáticamente usarán el nuevo cuadro SwiftValue
para permitir la conversión a Obj-C objetos.
El mensaje de confirmación inicial para swift / stdlib / public / runtime / SwiftValue.mm dice:
Tiempo de ejecución: Implementar una clase opaca ''SwiftValue'' ObjC para mantener los valores puenteados
Si no hay una mejor asignación para un valor Swift en un objeto Objective-C para fines de puente, podemos recurrir al boxeo el valor en una clase. Esta clase no tiene ninguna interfaz pública más allá de ser
NSObject
NSObject en Objective-C, pero es reconocida por el tiempo de ejecución de Swift para que pueda ser devuelta dinámicamente al tipo encuadrado.