ios swift xcode swift3 xcode8-beta6

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.

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.