El método de anulación con el selector 'touchesBegan:withEvent:' tiene un tipo incompatible '(NSSet, UIEvent) -> ()'

Resuelto SoCor asked hace 54 años • 9 respuestas

Xcódigo 6.3. Dentro de una clase que implementa el protocolo UITextFieldDelegate, me gustaría anular el método touchesBegan() para posiblemente ocultar el teclado. Si evito un error del compilador en la especificación de la función, entonces hay un error del compilador al intentar leer el "toque" del Set o NSSet, o super.touchesBegan(touches, withEvent:event) arroja un error. ¡Una de estas combinaciones compiladas en Xcode 6.2! (Entonces, ¿dónde está la documentación para "Establecer" Swift y cómo obtener un elemento de uno?)

 override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
    // Hiding the Keyboard when the User Taps the Background
        if let touch =  touches.anyObject() as? UITouch {
            if nameTF.isFirstResponder() && touch.view != nameTF {
                nameTF.resignFirstResponder();
            }
        }
        super.touchesBegan(touches , withEvent:event)
    }

Intentar:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) or
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent) 

Error del compilador: el método de anulación con el selector 'touchesBegan:withEvent:' tiene un tipo incompatible '(NSSet, UIEvent) -> ()' y

super.touchesBegan(touches , withEvent:event)

también se queja

'NSSet' no es implícitamente convertible a 'Set'; ¿Quisiste usar 'como' para convertir explícitamente?

Intentar:

override func touchesBegan(touches: Set<AnyObject>, withEvent event: UIEvent) 

Error del compilador: el tipo 'AnyObject' no se ajusta al protocolo 'Hashable'

Intentar:

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) 

Error del compilador en

if let touch = touches.anyObject() as? UITouch 

'Set' no tiene un miembro llamado 'anyObject' PERO la especificación de función y la llamada a super() están bien.

Intentar:

override func touchesBegan(touches: NSSet<AnyObject>, withEvent event: UIEvent) -> () or
override func touchesBegan(touches: NSSet<NSObject>, withEvent event: UIEvent) 

Error del compilador: no se puede especializar el tipo no genérico 'NSSet'

SoCor avatar Jan 01 '70 08:01 SoCor
Aceptado

Swift 1.2 (Xcode 6.3) introdujo un tipo nativo Setque sirve de puente con NSSet. Esto se menciona en el blog de Swift y en las notas de la versión de Xcode 6.3 , pero aparentemente aún no se ha agregado a la documentación oficial (actualización: como señaló Ahmad Ghadiri , ahora está documentado).

El UIRespondermétodo ahora se declara como

func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)

y puedes anularlo así:

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    if let touch = touches.first as? UITouch {
        // ...
    }
    super.touchesBegan(touches , withEvent:event)
}

Actualización para Swift 2 (Xcode 7): ( Error de función de anulación de comparación en Swift 2 )

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    if let touch = touches.first {
        // ...
    }
    super.touchesBegan(touches, withEvent:event)
}

Actualización para Swift 3:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        // ...
    }
    super.touchesBegan(touches, with: event)
}
Martin R avatar Feb 27 '2015 18:02 Martin R

Con xCode 7 y swift 2.0, use el siguiente código:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

    if let touch =  touches.first{
        print("\(touch)")
    }
    super.touchesBegan(touches, withEvent: event)
}

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {

    if let touch = touches.first{
        print("\(touch)")
    }
    super.touchesEnded(touches, withEvent: event)
}

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {

    if let touch = touches.first{
        print("\(touch)")
    }
    super.touchesMoved(touches, withEvent: event)
}
Himanshu Mahajan avatar Oct 14 '2015 14:10 Himanshu Mahajan

Usando Swift 3 y Xcode 8

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {

}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

}

override func touchesCancelled(_ touches: Set<UITouch>?, with event: UIEvent?) {
// Don't forget to add "?" after Set<UITouch>
}
Chetan Prajapati avatar Sep 20 '2016 17:09 Chetan Prajapati

Ahora está en la referencia de la API de Apple aquí y para anular en xCode versión 6.3 y swift 1.2 puede usar este código:

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    if let touch =  touches.first as? UITouch {
         // ...
    }
    // ...
}
Ahmad Ghadiri avatar Apr 09 '2015 21:04 Ahmad Ghadiri