swift4 - ¿El uso de la inferencia Swift 3 @objc en el modo Swift 4 está en desuso?




xcode9-beta (8)

Me deshice de esta advertencia cambiando la configuración de compilación de "Inferencia Swob 3 @objc" de mis objetivos a "Predeterminado".

De este artículo :

Antes de Swift 4, el compilador hizo algunas declaraciones Swift automáticamente disponibles para Objective-C . Por ejemplo, si una subclase de NSObject, el compilador creó puntos de entrada de Objective-C para todos los métodos en tales clases. El mecanismo se llama inferencia @objc.

En Swift 4, dicha inferencia automática @objc está en desuso porque es costoso generar todos esos puntos de entrada de Objective-C. Cuando la configuración de "Inferencia Swob 3 @objc" se establece en "On", permite que el código antiguo funcione. Sin embargo, mostrará advertencias de desprecio que deben abordarse. Se recomienda "corregir" estas advertencias y cambiar la configuración a "Predeterminado" , que es la predeterminada para los nuevos proyectos Swift.

Por favor, consulte también esta propuesta Swift para más información.

Brevemente, mientras uso Xcode 9 Beta, me he encontrado con la siguiente advertencia:

El uso de la inferencia Swift 3 @objc en el modo Swift 4 está en desuso. Dirija las advertencias de inferencia @objc en desuso, pruebe su código con el "Registro de inferencia Swift 3 @objc desaprobado" habilitado, y deshabilite la inferencia @objc Swift 3.

Después de algunas investigaciones, todavía no tengo idea de cómo solucionar el problema. Apreciaría enormemente cualquier consejo sobre cómo solucionar este problema, así como una explicación de lo que está sucediendo.

Mi objetivo es comprender mejor lo que está sucediendo con mi código.


¿El uso de la inferencia Swift 3 @objc en el modo Swift 4 está en desuso?

usar func call @objc

func call(){

foo()

}

@objc func foo() {

}

De hecho, deshacerse de esas advertencias al desactivar Swift 3 @objc Inference. Sin embargo, pueden surgir problemas sutiles. Por ejemplo, KVO dejará de funcionar. Este código funcionó perfectamente bajo Swift 3:

for (key, value) in jsonDict {
    if self.value(forKey: key) != nil {
        self.setValue(value, forKey: key)
    }
}

Después de migrar a Swift 4, y configurar "Swift 3 @objc Inference" como predeterminado, ciertas características de mi proyecto dejaron de funcionar . Me tomó algo de depuración e investigación para encontrar una solución para esto. Según mi mejor conocimiento, aquí están las opciones:

  • Habilitar "Swift 3 @objc Inference" (solo funciona si migró un proyecto existente desde Swift 3)
  • Marque los métodos afectados y las propiedades como @objc
  • Vuelva a habilitar la inferencia de ObjC para toda la clase usando @objcMembers

Rehabilitar la inferencia @objc te deja con las advertencias, pero es la solución más rápida. Tenga en cuenta que solo está disponible para proyectos migrados de una versión anterior de Swift. Las otras dos opciones son más tediosas y requieren un poco de excavación de códigos y pruebas exhaustivas.

Consulte también https://github.com/apple/swift-evolution/blob/master/proposals/0160-objc-inference.md


Recibí esta advertencia con la configuración "Swift 3 @objc Inference" = "Default". Entonces me di cuenta de que se había establecido para el Proyecto, no para el objetivo. Por lo tanto, asegúrese de tener la configuración "Predeterminada" en su objetivo para deshacerse de la advertencia.


- ¿Qué es la inferencia @objc ? Que esta pasando?

En Swift 3 , el compilador infiere @objc en varios lugares para que no tengas que hacerlo. En otras palabras, ¡asegúrate de agregar @objc para ti!

En Swift 4 , el compilador ya no hace esto (tanto). Ahora debe agregar @objc explícitamente.

Por defecto, si tiene un proyecto pre-Swift 4, recibirá advertencias sobre esto. En un proyecto Swift 4, obtendrás errores de compilación. Esto se controla a través de la SWIFT_SWIFT3_OBJC_INFERENCE compilación SWIFT_SWIFT3_OBJC_INFERENCE . En un proyecto pre-Swift 4, esto está configurado en On . Recomendaría establecer esto en Default (o Off ), que ahora es la opción predeterminada en un nuevo proyecto.

Tomará algún tiempo convertirlo todo, pero como es el predeterminado para Swift 4, vale la pena hacerlo.

- ¿Cómo detengo las advertencias / errores del compilador?

Hay dos formas de convertir su código para que el compilador no se queje.

Una es usar @objc en cada función o variable que deba exponerse al tiempo de ejecución de Objective-C:

@objc func foo() {

}

La otra es usar @objcMembers por una declaración de Class . Esto asegura que se agregue automáticamente @objc a TODAS las funciones y variables de la clase. Esta es la forma más fácil, pero tiene un costo, por ejemplo, puede aumentar el tamaño de su aplicación al exponer funciones que no necesitaban ser expuestas.

@objcMembers class Test {

}

- ¿Qué es @objc y por qué es necesario?

Si introduce nuevos métodos o variables en una clase Swift, marcarlos como @objc expone al tiempo de ejecución de Objective-C. Esto es necesario cuando tiene un código Objective-C que usa su clase Swift o, si está usando características de tipo Objective-C, como los Selectors . Por ejemplo, el patrón de acción de destino: button.addTarget(self, action:#selector(didPressButton), for:.touchUpInside)

- ¿Por qué no marcaría todo @objc ?

Hay @objc negativos que vienen con marcar algo como @objc :

  • Aumento del tamaño binario de la aplicación.
  • Sin sobrecarga de funciones

Tenga en cuenta que este es un resumen de muy alto nivel y que es más complicado de lo que escribí. Recomendaría leer la propuesta actual para más información.

Fuentes:


Swift 3 @objc Inference El uso de Swift 3 @objc inference en el modo Swift 4 está en desuso. Dirija las advertencias de inferencia @objc en desuso, pruebe su código con el registro "Uso de inferencia Swobob 3 @objc desaprobado" habilitado, y luego deshabilite la inferencia cambiando la configuración de compilación "Inferencia Swob 3 @objc" a "Predeterminado" para "XMLParsingURL" objetivo.

llegó a la

  1. El primer paso tiene la configuración de construcción

  2. Buscar en Crear Inferencia de Configuración

  3. cambiar swift 3 @objc Inference Default

introduzca la descripción de la imagen aquí


Migrator no puede identificar todas las funciones que necesitan @objc Inferred Objective-C thunk marcados como obsoletos para ayudarlo a encontrarlos.
• Construye advertencias sobre métodos desaprobados
• Mensajes de la consola cuando se ejecutan trucos en desuso


Hay tres opciones para agregar #pragma_mark en Swift:

1) // MARK: - your text here -

2) // TODO: - your text here -

3) // FIXME: - your text here -

Nota: Usos - para agregar separadores





swift swift4 xcode9-beta