为什么performSelector不存在于swift中

dux*_*x-- 14 ios swift

显然以下内容在swift中不再可用:

[self performSelector:@selector(onFlip) withObject:nil afterDelay:0.3];
Run Code Online (Sandbox Code Playgroud)

如果仍然存在以下情况,为什么会这样:

NSObject.cancelPreviousPerformRequestsWithTarget(self, selector: singleTapSelector, object: nil)
Run Code Online (Sandbox Code Playgroud)

nsobject.cancel不能与performSelector一起使用吗?为什么有取消功能而不是执行功能?

qwe*_*_so 16

使用

NSTimer.scheduledTimerWithTimeInterval(delay, target: self, selector: "onFlip", userInfo: nil, repeats: false)
Run Code Online (Sandbox Code Playgroud)

代替.不知道为什么另一个不可用.


Val*_*gin 11

我们可以在Swift 1.x中轻松解锁这些方法!好极了!

这个来自这个perfromSelector家族的方法实际上存在于Swift中,但它们在Swift 2.0之前被人为地隐藏(我认为是设计).它们可以在Swift中使用混合和一些Objective-C运行时攻击来揭开.

只需添加此扩展文件NSObject+PerformSelector.swift并使用 symbol.

In your case the code:

[self performSelector:@selector(onFlip) withObject:nil afterDelay:0.3];
Run Code Online (Sandbox Code Playgroud)

can be rewritten in Swift like this:

self.performSelector("onFlip", withObject: nil, afterDelay: 0.3)
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)

  • 火箭的象征为什么? (3认同)
  • 老实说,我认为允许表情符号是一个最愚蠢的想法.因此,我不必通过键盘输入,而是在恼人的表格中点击.这根本不好笑.最好的说是傻. (2认同)

The*_*Art 5

func performFlipOnDelay() {
  let delayInSeconds = 1.0
  let delay = dispatch_time(DISPATCH_TIME_NOW, Int64(delayInSeconds * Double(NSEC_PER_SEC)))
  dispatch_after(delay, dispatch_get_main_queue()) { 
     onFlip();
  }
}
Run Code Online (Sandbox Code Playgroud)

关于答案的另一轮将是上面使用GCD为要执行的动作添加延迟时间