首页 > 学院 > 开发设计 > 正文

Swift里performSelector方法的替代

2019-11-14 20:17:46
字体:
来源:转载
供稿:网友

最近在回答StackOverflow的问题时,发现performSelector方法在Swift被去掉,Apple的注释是这个方法被去掉是因为不安全:

NOTEThe performSelector: method and related selector-invoking methods are not imported in Swift because they are inherently unsafe.

如果在Swift调用这个方法会编译出错:

'performSelector' is unavailable: 'performSelector' methods are unavailable

方法一:

反复尝试后,我发现可以使用 UIControl

func sendAction(_ action: Selector, to target: AnyObject!, forEvent event: UIEvent!)

下面是一段演示代码:

import UIKitclass ViewController: UIViewController {                                override func viewDidLoad() {        super.viewDidLoad()        // Do any additional setup after loading the view, typically from a nib.                var control:UIControl = UIControl()        control.sendAction(Selector("greetings"), to: self, forEvent: nil)    }        func greetings() {        PRintln("greetings world")    }    override func didReceiveMemoryWarning() {        super.didReceiveMemoryWarning()        // Dispose of any resources that can be recreated.    }}

Log打印出:

greetings world

如果是Swift调用Objective-C类的target和action,可以参考下面的例子,假设有TestClass是Objective-C类,并且有getBarButtonItem返回UIBarButtonItem:

#import "TestClass.h"@implementation TestClass- (UIBarButtonItem *)getBarButtonItem{    UIBarButtonItem *bar = [[UIBarButtonItem alloc] init];    bar.target = self;    bar.action = @selector(help);    return bar;}- (void)help{    NSLog(@"Help offered");}@end

那么在Swift里可以用下面的代码执行help方法:

import UIKitclass ViewController: UIViewController {                                override func viewDidLoad() {        super.viewDidLoad()        // Do any additional setup after loading the view, typically from a nib.                var testClass = TestClass()        var button: UIButton = UIButton()        var barButtonItem = testClass.getBarButtonItem()        button.sendAction(barButtonItem.action, to: barButtonItem.target, forEvent: nil)    }    }

Log打印出:

2014-07-06 23:49:49.942 TestApp [53986:2552835] Help offered

方法二:

可以使用NSThread.detachNewThreadSelector,好处是可以使用延迟,并且可以附带object,下面是掩饰代码:

import UIKitclass ViewController: UIViewController {        override func viewDidLoad() {        super.viewDidLoad()        // Do any additional setup after loading the view, typically from a nib.                let delay = 2.0 * Double(NSEC_PER_SEC)        var time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))        dispatch_after(time, dispatch_get_main_queue(), {            NSThread.detachNewThreadSelector(Selector("greetings:"), toTarget:self, withObject: "sunshine")        })    }        func greetings(object: AnyObject?) {        println("greetings world")        println("attached object: /(object)")    }    }

方法三:

使用NSTimer:

class func scheduledTimerWithTimeInterval(_ seconds: NSTimeInterval,                                      target target: AnyObject!,                                 selector aSelector: Selector,                                  userInfo userInfo: AnyObject!,                                    repeats repeats: Bool) -> NSTimer!

  

Xcode 6 Beta2

另外请参考一篇不错的文章:初探swift语言的学习笔记十一(performSelector)

作者:Yang Zhou
出处:http://yangzhou1030.VEVb.com
本文版权归作者和博客园共有,未经作者同意禁止转载,作者保留追究法律责任的权利。请在文章页面明显位置给出原文连接,作者保留追究法律责任的权利。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表