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
@objcinferencia Swift 3 en el modo Swift 4 está en desuso. Por favor, aborde las@objcadvertencias de inferencia en desuso , pruebe su código con el@objcregistro " Uso de inferencia en desuso Swift 3 "habilitado y desactive la@objcinferencia Swift 3 ". ¿Alguna idea de dónde habilitar dicho@objcregistro de inferencia Swift 3 ?- ¿Qué es la
@objcinferencia? Que esta pasando?En
Swift 3, el compilador deduce@objcen varios lugares para que no tenga que hacerlo. En otras palabras, ¡se asegura de agregar@objcpara usted!En
Swift 4, el compilador ya no hace esto (tanto). Ahora debe agregar@objcexplí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_INFERENCEconfiguració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
@objcen cada función o variable que deba exponerse al tiempo de ejecución de Objective-C:El otro es usarlo
@objcMembersmediante unaClassdeclaración. Esto se asegura de agregar automáticamente@objca 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
@objcy por qué es necesario?Si introduce nuevos métodos o variables en una clase Swift, marcándolos como
@objcexpuestos 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
@objcno implica despacho dinámico, Swift es libre de usar despacho estático o virtual (y posiblemente ejecutar código diferente como resultado). Ladynamicpalabra clave es necesaria para obligar a Swift a utilizar el despacho dinámico.@objcdepricated, ¿qué debemos usar?SWIFT_SWIFT3_OBJC_INFERENCEalOn. Convierte a Swift 4. Luego aborda las@objccosas. 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.marchivo. Esto debería hacer que la conversión sea relativamente indolora.@objccambió 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
@objsiguen 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.pbxprojarchivo 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