with unrecognized sent pass parameter selector swift type-safety

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.