AnyObject no funciona en Xcode8 beta6?

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(_ 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 inversa: desde Xcode 8 / beta 6, la prueba is siempre debe evaluarse 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.

Joe Groff escribe :

Esto es correcto, porque todo se AnyObject a AnyObject 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.

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: