We can easily unlock these methods in Swift 1.x! Yay!
These methods from the perfromSelector
family actually exist in Swift but they were artificially hidden (by design, I think) prior Swift 2.0. They can be unveiled using swizzling and some Objective-C runtime hacks right in Swift.
Just add this extension file NSObject+PerformSelector.swift
and prefix all calls with
symbol.
In your case the code:
[self performSelector:@selector(onFlip) withObject:nil afterDelay:0.3];
can be rewritten in Swift like this:
self.performSelector("onFlip", withObject: nil, afterDelay: 0.3)
With using this magical category (class extension):
NSObject+PerformSelector.swift
import Foundation
private var dispatchOnceToken: dispatch_once_t = 0
private var selectors: [Selector] = [
"performSelector:",
"performSelector:withObject:",
"performSelector:withObject:withObject:",
"performSelector:withObject:afterDelay:inModes:",
"performSelector:withObject:afterDelay:",
]
private func swizzle() {
dispatch_once(&dispatchOnceToken) {
for selector: Selector in selectors {
let selector = Selector("\(selector)")
let method = class_getInstanceMethod(NSObject.self, selector)
class_replaceMethod(
NSObject.self,
selector,
method_getImplementation(method),
method_getTypeEncoding(method)
)
}
}
}
extension NSObject {
func performSelector(selector: Selector) -> AnyObject? {
swizzle()
return self.performSelector(selector)
}
func performSelector(selector: Selector, withObject object: AnyObject?) -> AnyObject? {
swizzle()
return self.performSelector(selector, withObject: object)
}
func performSelector(selector: Selector, withObject object1: AnyObject?, withObject object2: AnyObject?) -> AnyObject? {
swizzle()
return self.performSelector(selector, withObject: object1, withObject: object2)
}
func performSelector(selector: Selector, withObject object: AnyObject?, afterDelay delay: NSTimeInterval, inModes modes: [AnyObject?]?) {
swizzle()
self.performSelector(selector, withObject: object, afterDelay: delay, inModes: modes)
}
func performSelector(selector: Selector, withObject object: AnyObject?, afterDelay delay: NSTimeInterval) {
swizzle()
self.performSelector(selector, withObject: object, afterDelay: delay)
}
}