¿Algún object no funciona en Xcode8 beta6?

En Xcode8 beta6, el siguiente código provocará una advertencia: la testing 'es' siempre es verdadera. Pero no se imprimirá el pase.

struct TestStruct { } //warning: 'is' test is always true if TestStruct() is AnyObject { print("pass") } 

Y el siguiente código provocará una advertencia: el reparto 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 según lo previsto: el retorno false de TestStruct() is AnyObject ; sin embargo, no

La versión previa de esta respuesta percibió la advertencia,

La testing 'es' es siempre verdadera.

como el error, y contenía alguna discusión sobre por qué se percibía esta advertencia aparente de errores. Que TestStruct() is AnyObject evaluado a false en time de ejecución, sin embargo, se percibió como comportamiento esperado.

Dados los comentarios al informe de errores presentado por el OP (SR-2420) , parece que la situación es inversa: dado que Xcode 8 / beta 6, la testing is siempre debe ser true , y el error que la publicación OP: s el hecho de que TestStruct() is AnyObject evalúa como false durante el time de ejecución.

Joe Groff escribe :

Esto es correcto, ya que todo se AnyObject a AnyObject ahora.

is / as AnyObject siempre tiene éxito para todos los types ahora. Se comporta de la manera prevista.


El nuevo cuadro SwiftValue para la conversión de valores Swift a objects Obj-C

(para más detalles, 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 los objects Obj-C a través de, por ejemplo, la conformidad con _ObjectiveCBridgeable (ver, por ejemplo, las siguientes preguntas y respuestas para get detalles sobre _ObjectiveCBridgeable ), utilizarán automáticamente el nuevo cuadro SwiftValue para permitir la conversión a Obj-C objects.

El post de confirmación inicial para swift / stdlib / public / runtime / SwiftValue.mm dice:

Runtime: implementa una class opaca 'SwiftValue' ObjC para mantener valores puenteados

Si no hay una asignación mejor para un valor Swift en un object Objective-C para fines de puenteo, podemos retroceder al boxeo del valor de una class. Esta class no tiene ninguna interfaz pública más allá de ser NSObject -conforme en Objective-C, pero es reconocida por el time de ejecución de Swift para que pueda devolverse dinámicamente al tipo de caja.

Larga historia corta.

Para comprobar si el valor tiene un tipo de reference:

 if type(of: value) is AnyClass { // ... } 

Para verificar si el tipo es un tipo de reference:

 if SomeType.self is AnyClass { // ... } 

Respuestas más útiles: