Swift performSelector: withObject: afterDelay:

Tengo una aplicación en Objective C que estoy haciendo la transición a Swift. En el Objetivo C, tengo este método:

[self.view performSelector:@selector(someSelector) withObject:self afterDelay:0.1f];

Estoy trabajando con Swift y no puedo entender cómo hacerlo. He intentado:

self.view.performSelector(Selector("someSelector"), withObject: self, afterDelay: 0.1)

Aquí está el error que obtengo: 'performSelector' is unavailable: 'performSelector' methods are unavailable

¿Qué llamada utilizaría para llamar a un método después de afterDelay ?

ACTUALIZAR

Esto es lo que acabé con:

 extension NSObject { func callSelectorAsync(selector: Selector, object: AnyObject?, delay: NSTimeInterval) -> NSTimer { let timer = NSTimer.scheduledTimerWithTimeInterval(delay, target: self, selector: selector, userInfo: object, repeats: false) return timer } func callSelector(selector: Selector, object: AnyObject?, delay: NSTimeInterval) { let delay = delay * Double(NSEC_PER_SEC) let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) dispatch_after(time, dispatch_get_main_queue(), { NSThread.detachNewThreadSelector(selector, toTarget:self, withObject: object) }) } } 

Como hiciste con Objective-C, usa simplemente:

Swift 3

 DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(0.1)) { // your function here } 

Swift 2

 let dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC))) dispatch_after(dispatchTime, dispatch_get_main_queue(), { // your function here }) 

No es necesario agregar una sobrecarga innecesaria instanciando un NSTimer .

La advertencia (y la frustración) que notará es que el autocompletado de Xcode no los rellena en Swift como lo hace en Objective-C.

Aquí hay una colección de github gists que se expanden: https://gist.github.com/calebd/3ec29b084f31e41dbc76

Y, por último, un grito masivo a la respuesta de @ matt aquí que envuelve todo el bloque en una function global orderada que puede usarse en cualquier parte de su aplicación, de modo que en lugar de ese complicado código, puede hacer lo siguiente:

 delay(n) { // stuff! } 

Puedes hacer esto:

 var timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("someSelector"), userInfo: nil, repeats: false) func someSelector() { // Something after a delay } 

SWIFT 3

 let timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(someSelector), userInfo: nil, repeats: false) func someSelector() { // Something after a delay } 

Swift está tipificado estáticamente por lo que performSelector: methods deben caer en el path.

En su lugar, use GCD para enviar un bloque adecuado a la queue relevante; en este caso, presumiblemente será la queue principal ya que parece que está haciendo el trabajo de UIKit.

EDIT: the performSelector: relevante performSelector: también falta en la versión Swift de la documentation de NSRunLoop ("1 símbolo de Objective-C oculto"), por lo que no puede saltar directamente con eso. Con eso y su ausencia del Swiftified NSObject diría que está bastante claro qué Apple está pensando aquí.