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
AnyObjectaAnyObjectahora....
is/asAnyObjectsiempre 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
NSObjectNSObject en Objective-C, pero es reconocida por el tiempo de ejecución de Swift para que pueda ser devuelta dinámicamente al tipo encuadrado.