Swift performSelector:withObject:afterDelay: is unavailable [duplicate] Swift performSelector:withObject:afterDelay: is unavailable [duplicate] swift swift

Swift performSelector:withObject:afterDelay: is unavailable [duplicate]


Swift 4

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

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 })


You could do this:

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 is statically typed so the performSelector: methods are to fall by the wayside.

Instead, use GCD to dispatch a suitable block to the relevant queue — in this case it'll presumably be the main queue since it looks like you're doing UIKit work.

EDIT: the relevant performSelector: is also notably missing from the Swift version of the NSRunLoop documentation ("1 Objective-C symbol hidden") so you can't jump straight in with that. With that and its absence from the Swiftified NSObject I'd argue it's pretty clear what Apple is thinking here.