zoukankan      html  css  js  c++  java
  • Swift里performSelector方法的替代

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

    NOTE
    The 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 UIKit
    
    class 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 UIKit
    
    class 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 UIKit
    
    class 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.cnblogs.com
    本文版权归作者和博客园共有,未经作者同意禁止转载,作者保留追究法律责任的权利。请在文章页面明显位置给出原文连接,作者保留追究法律责任的权利。
  • 相关阅读:
    BZOJ 1257 [CQOI2007]余数之和sum | 数论
    【模板】网络流-最大流模板(Dinic)
    BZOJ 3230 相似子串 | 后缀数组 二分 ST表
    BZOJ 1031 [JSOI2007]字符加密Cipher | 后缀数组模板题
    后缀数组模板(全注释)
    BZOJ 3190 赛车 | 计算几何
    BZOJ 1007 水平可见直线 | 计算几何
    BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划
    BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划
    BZOJ 2527 Meteors | 整体二分
  • 原文地址:https://www.cnblogs.com/yangzhou1030/p/3830592.html
Copyright © 2011-2022 走看看