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 obsoleta @objc, pruebe su código con el registro "Uso de inferencia obsoleta Swift 3 @objc" habilitado y desactive la inferencia Swift 3 @objc. **
Después de un poco de investigación, todavía no tengo idea de cómo solucionar el problema. Agradecería mucho 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.
swift
swift4
xcode9-beta
DaleK
fuente
fuente
Respuestas:
Eliminé esta advertencia cambiando la configuración de compilación "Swift 3 @objc Inference" de mis objetivos a "Predeterminado".
De este artículo :
Consulte también esta propuesta de Swift para obtener más información.
fuente
@objc
inferencia Swift 3 en el modo Swift 4 está en desuso. Por favor, aborde las@objc
advertencias de inferencia en desuso , pruebe su código con el@objc
registro " Uso de inferencia en desuso Swift 3 "habilitado y desactive la@objc
inferencia Swift 3 ". ¿Alguna idea de dónde habilitar dicho@objc
registro de inferencia Swift 3 ?- ¿Qué es la
@objc
inferencia? Que esta pasando?En
Swift 3
, el compilador deduce@objc
en varios lugares para que no tenga que hacerlo. En otras palabras, ¡se asegura de agregar@objc
para usted!En
Swift 4
, el compilador ya no hace esto (tanto). Ahora debe agregar@objc
explícitamente.Por defecto, si tiene un proyecto anterior a Swift 4, recibirá advertencias al respecto. En un proyecto Swift 4, obtendrá errores de compilación. Esto se controla mediante la
SWIFT_SWIFT3_OBJC_INFERENCE
configuración de compilación. En un proyecto anterior a Swift 4, esto se establece enOn
. Recomendaría establecer esto enDefault
(oOff
), que ahora es la opción predeterminada en un nuevo proyecto.Tomará algún tiempo convertir todo, pero dado que es el valor 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:El otro es usarlo
@objcMembers
mediante unaClass
declaración. Esto se asegura de agregar automáticamente@objc
a TODAS las funciones y variables en la clase. Esta es la manera fácil, pero tiene un costo, por ejemplo, puede aumentar el tamaño de su aplicación al exponer funciones que no necesitaban estar expuestas.- ¿Qué es
@objc
y por qué es necesario?Si introduce nuevos métodos o variables en una clase Swift, marcándolos como
@objc
expuestos 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 comoSelectors
. Por ejemplo, el patrón de acción objetivo:button.addTarget(self, action:#selector(didPressButton), for:.touchUpInside)
- ¿Por qué no marcaría todo
@objc
?Hay aspectos negativos que vienen con marcar algo como
@objc
: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 real para obtener más información.
Fuentes:
fuente
@objc
no implica despacho dinámico, Swift es libre de usar despacho estático o virtual (y posiblemente ejecutar código diferente como resultado). Ladynamic
palabra clave es necesaria para obligar a Swift a utilizar el despacho dinámico.@objc
depricated, ¿qué debemos usar?SWIFT_SWIFT3_OBJC_INFERENCE
alOn
. Convierte a Swift 4. Luego aborda las@objc
cosas. Para hacerlo simple, siga las reglas básicas: SI la clase Swift se usa en el código Objc-C (a través del encabezado de puente), use@objcMembers
, de lo contrario, agregar uno por uno@objc
. Simplemente use la búsqueda Xcode para averiguar si se llama a la clase Swift desde cualquier.m
archivo. Esto debería hacer que la conversión sea relativamente indolora.@objc
cambió en Swift 4 y luego tomar la decisión de arreglar el proyecto y mantenerlo igual.El migrador no puede identificar todas las funciones que necesitan los thunk de Objective-C inferidos de @objc marcados como obsoletos para ayudarlo a encontrarlos.
• Cree advertencias sobre métodos
obsoletos.
fuente
Recibí esta advertencia con la configuración "Swift 3 @objc Inference" = "Predeterminado". Entonces me di cuenta de que estaba configurado 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.
fuente
Simplemente puede pasar a "predeterminado" en lugar de "ON". Parece más adherente a la lógica de Apple.
(pero todos los otros comentarios sobre el uso de
@obj
siguen siendo válidos).fuente
De hecho, se deshará de esas advertencias deshabilitando Swift 3 @objc Inference. Sin embargo, pueden surgir problemas sutiles. Por ejemplo, KVO dejará de funcionar. Este código funcionó perfectamente en Swift 3:
Después de migrar a Swift 4 y configurar "Swift 3 @objc Inference" de manera predeterminada, ciertas funciones de mi proyecto dejaron de funcionar . Me tomó un poco de depuración e investigación para encontrar una solución para esto. Según mi mejor conocimiento, estas son las opciones:
Volver a habilitar 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 desde una versión anterior de Swift. Las otras dos opciones son más tediosas y requieren un poco de excavación de código y pruebas exhaustivas.
Ver también https://github.com/apple/swift-evolution/blob/master/proposals/0160-objc-inference.md
fuente
Soy un desarrollador de iOS ocasional (pronto será más) pero todavía no pude encontrar la configuración según la otra respuesta (ya que no tenía ese elemento de Llavero que muestra la respuesta), así que ahora que lo encontré pensé Podría agregar esta instantánea con las ubicaciones resaltadas en las que deberá hacer clic y buscar.
fuente
Puede intentar "Actualizar pod" y / o "limpiar el aleteo"
También configuré esta configuración en xcode.
La configuración de la interfaz Objective-C es la siguiente:
fuente
Inferencia Swift 3 @objc El uso de la inferencia Swift 3 @objc en el modo Swift 4 está en desuso. Dirija las advertencias de inferencia obsoleta @objc, pruebe su código con el registro "Uso de inferencia obsoleta Swift 3 @objc" habilitado, y luego desactive la inferencia cambiando la configuración de compilación "Inferencia Swift 3 @objc" a "Predeterminado" para "XMLParsingURL" objetivo.
llegué a la
El primer paso consiguió la configuración de compilación
Buscar para generar inferencia de configuración
cambiar swift 3 @objc Inferencia Predeterminado
ingrese la descripción de la imagen aquí
fuente
Todo lo que necesita es ejecutar una prueba, esperar hasta que termine, después de eso vaya a Configuración de compilación, Buscar en Inferencia de configuración de compilación, cambie Swift 3 @objc Inference a (Predeterminado). Eso es todo lo que hice y funcionó perfectamente.
fuente
use func call @objc
fuente
Además de lo que dijo @wisekiddo, también puede modificar su configuración de compilación en el
project.pbxproj
archivo configurando la Inferencia Swift 3 @obj como predeterminadaSWIFT_SWIFT3_OBJC_INFERENCE = Default;
para sus sabores de compilación (es decir, depurar y liberar), especialmente si viene de otro entorno además de Xcodefuente