如何在协议扩展中使用#selector(myMethodName)?

这本书
protocol LazyUpdateable {
    func waitToDoStuff()
    func myMethodName()
}


extension LazyUpdateable where Self: NSObject {
    func waitToDoStuff() {
        self.performSelector(#selector(myMethodName), withObject: nil, afterDelay: 1.5)
    }

    func myMethodName() {

    }
}

通过此更新,我得到了错误Argument of #selector refers to a method that is not exposed to objective c,但是如果我使用旧版本,则会Selector("myMethodName")收到警告,要求更改为更好的方法。#selector()在这种情况下可以使用吗?@objc我已经尝试过了,但无法在我的协议上进行设置

这是您可以尝试显示的游乐场,不适用于设置 @objc

import Foundation
import UIKit
import XCPlayground


@objc protocol LazyUpdatable {
    optional func waitToDoStuff()
    optional func myMethodName()
}

extension LazyUpdatable where Self: UIViewController {
    func waitToDoStuff() {
        self.performSelector(#selector(myMethodName), withObject: nil, afterDelay: 1.5)
    }

    func myMethodName() {
        print("LOL")
    }
}


@objc
class AViewController: UIViewController, LazyUpdatable {
    func start() {
        waitToDoStuff()
    }
}

let aViewController = AViewController()
aViewController.start()

XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
艾文德(Eivind RannemBøhler)

使用#selector()或Selector()进行动态调度不会看到您的Swift协议扩展。相反,如果可能,请尝试完全避免使用Objective-C。您可以使用libdispatch达到相同的结果:

protocol LazyUpdatable {

    func waitToDoStuff()
    func myMethodName()
}

extension LazyUpdatable {

    func waitToDoStuff() {
        let dispatchTime = dispatch_time(DISPATCH_TIME_NOW, Int64(1.5 * Double(NSEC_PER_SEC)))
        dispatch_after(dispatchTime, dispatch_get_main_queue()) {
            self.myMethodName()
        }
    }

    func myMethodName() {
        print("Aloha!")
    }
}

class ViewController: UIViewController, LazyUpdatable {

    override func viewDidLoad() {
        super.viewDidLoad()
        waitToDoStuff()
    }
}

当然,这不像使用选择器那样灵活,但是可以让您使用真正的Swift协议扩展。

编辑:如果您希望能够取消调用方法调用,请尝试以下操作:

var lazyUpdatableCancelKey = UInt8(0)

protocol LazyUpdatable: class {

    func waitToDoStuff()
    func cancelDoingStuff()
    func myMethodName()
}

extension LazyUpdatable {

    func waitToDoStuff() {
        let dispatchTime = dispatch_time(DISPATCH_TIME_NOW, Int64(1.5 * Double(NSEC_PER_SEC)))
        dispatch_after(dispatchTime, dispatch_get_main_queue()) {
            if let shouldCancel = objc_getAssociatedObject(self, &lazyUpdatableCancelKey) as? Bool where shouldCancel == true {
                return
            }
            self.myMethodName()
        }
    }

    func cancelDoingStuff() {
        objc_setAssociatedObject(self, &lazyUpdatableCancelKey, true, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    }

    func myMethodName() {
        print("Aloha!")
    }
}

class ViewController: UIViewController, LazyUpdatable {

    override func viewDidLoad() {
        super.viewDidLoad()
        waitToDoStuff()

        let dispatchTime = dispatch_time(DISPATCH_TIME_NOW, Int64(1.4 * Double(NSEC_PER_SEC)))
        dispatch_after(dispatchTime, dispatch_get_main_queue()) {
            self.cancelDoingStuff()
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Swift中使用扩展协议在Obj-C类上公开现有属性

来自分类Dev

如何在Swift中具有泛型的扩展中使用带有可选类方法的协议?

来自分类Dev

如何在协议扩展中正确使用“self”以避免必须使用协议存根?

来自分类Dev

如何在括号扩展中使用变量

来自分类Dev

如何在execvp中使用内联扩展

来自分类Dev

如何在delphi中使用fmx扩展

来自分类Dev

如何在翻新中使用NullPointer扩展

来自分类Dev

如何在Python中使用DICT协议客户端?

来自分类Dev

如何在桌面应用程序中使用测量协议

来自分类Dev

如何在方法签名中使用协议的类型?

来自分类Dev

如何在通用函数中使用Swift通用Decodable协议

来自分类Dev

如何在omnet ++中使用AODV协议实施重播攻击?

来自分类Dev

如何在协议扩展中设置委托

来自分类Dev

如何在Swift中扩展协议

来自分类Dev

如何在Swift中使用具有相同协议变量的多个协议?

来自分类Dev

如何在Jquery Selector中使用c#ViewBag变量?

来自分类Dev

如何在Jquery Selector中使用c#ViewBag变量?

来自分类Dev

如何使用associatedtype和array扩展协议

来自分类Dev

如何使用associatedtype和array扩展协议

来自分类Dev

我可以在协议扩展中使用`inout`吗?

来自分类Dev

我可以在协议扩展中使用`inout`吗?

来自分类Dev

如何在Scala中使用隐式参数扩展类

来自分类Dev

如何在.gitignore文件中使用可选扩展名?

来自分类Dev

如何在Backbone.Model.extend中使用多个扩展?

来自分类Dev

如何在LINQ语句中使用扩展方法?

来自分类Dev

如何在扩展ListActivity的Activity中使用onCreateOptionsMenu()

来自分类Dev

如何在不扩展Activity的类中使用getBaseContext()

来自分类Dev

如何在virtualenv中使用gdb python调试扩展

来自分类Dev

如何在Python中使用反应性扩展(Rx)LINQ?

Related 相关文章

  1. 1

    如何在Swift中使用扩展协议在Obj-C类上公开现有属性

  2. 2

    如何在Swift中具有泛型的扩展中使用带有可选类方法的协议?

  3. 3

    如何在协议扩展中正确使用“self”以避免必须使用协议存根?

  4. 4

    如何在括号扩展中使用变量

  5. 5

    如何在execvp中使用内联扩展

  6. 6

    如何在delphi中使用fmx扩展

  7. 7

    如何在翻新中使用NullPointer扩展

  8. 8

    如何在Python中使用DICT协议客户端?

  9. 9

    如何在桌面应用程序中使用测量协议

  10. 10

    如何在方法签名中使用协议的类型?

  11. 11

    如何在通用函数中使用Swift通用Decodable协议

  12. 12

    如何在omnet ++中使用AODV协议实施重播攻击?

  13. 13

    如何在协议扩展中设置委托

  14. 14

    如何在Swift中扩展协议

  15. 15

    如何在Swift中使用具有相同协议变量的多个协议?

  16. 16

    如何在Jquery Selector中使用c#ViewBag变量?

  17. 17

    如何在Jquery Selector中使用c#ViewBag变量?

  18. 18

    如何使用associatedtype和array扩展协议

  19. 19

    如何使用associatedtype和array扩展协议

  20. 20

    我可以在协议扩展中使用`inout`吗?

  21. 21

    我可以在协议扩展中使用`inout`吗?

  22. 22

    如何在Scala中使用隐式参数扩展类

  23. 23

    如何在.gitignore文件中使用可选扩展名?

  24. 24

    如何在Backbone.Model.extend中使用多个扩展?

  25. 25

    如何在LINQ语句中使用扩展方法?

  26. 26

    如何在扩展ListActivity的Activity中使用onCreateOptionsMenu()

  27. 27

    如何在不扩展Activity的类中使用getBaseContext()

  28. 28

    如何在virtualenv中使用gdb python调试扩展

  29. 29

    如何在Python中使用反应性扩展(Rx)LINQ?

热门标签

归档