unrecognized - ¿Hay una forma segura de usar selectores en Swift?
swift selector with arguments (3)
Los selectores a prueba de tipos se lanzaron en Xcode 7.3 beta 4:
let sel = #selector(insertSubview(_:aboveSubview:)) // sel has type
Selector
ahora es un ciudadano de primera clase y viene con algunas advertencias del compilador Swift. Si es necesario, todavía puede pasar en una cadena:
let sel = Selector("propertyName")
Vea una respuesta mucho más completa aquí: @selector () en Swift?
Notas de la versión de Xcode: http://adcdownload.apple.com/Developer_Tools/Xcode_7.3_beta_4/Xcode_7.3_beta_4_Release_Notes.pdf
En su mayor parte, Swift es una gran mejora con respecto a Objective-C en términos de seguridad de tipos. Una excepción evidente es selectores. En Objective-C, usar la expresión @selector(notARealSelector:)
dará una advertencia al compilador. El Swift equivalente, Selector("notARealSelector:")
siempre compilará pero fallará en tiempo de ejecución.
¿Existe una forma segura de usar los selectores en Swift, por lo que puedo trabajar con las API de Objective-C que las requieren?
Tengo muchos observadores de NSNotification
en mi aplicación y me gustaría tener algún tipo de verificación en tiempo de compilación de que no estoy cometiendo errores tipográficos en mis selectores.
Edición : el caso de uso específico es NSNotificationCenter.addObserver
.
Puede usar la reflexión para obtener los nombres de las propiedades de un objeto como cadenas, como se resume en esta respuesta , pero eso no hará que la conexión entre un identificador y su nombre de cadena sea la @selector
hace @selector en ObjC. Algunos usos creativos de la reflexión pueden solucionar este problema, pero también puede hacer un buen error .
Utilice la noción Swift de opciones como:
if let result = object.notARealSelector?(/* args */) {
// Use Result
}
donde el ? se utiliza después de notARealSelector
con retorno false
a if
no hay tal método definido en el tipo de object
.
Hay una advertencia para los requisitos de protocolo opcionales :
Los requisitos de protocolo opcionales solo se pueden especificar si su protocolo está marcado con el atributo @objc. Incluso si no está interactuando con Objective-C, necesita marcar sus protocolos con el atributo @objc si desea especificar requisitos opcionales.
Pero como en primer lugar está preguntando acerca de los métodos opcionales, debe hablar sobre esto en el contexto de Objective-C.