swift中强类型的选择器

mus*_*afa 7 cocoa ios swift

我想知道我们可以在swift中实现强类型选择器吗?例如,如果我buttonTapped(sender: AnyObject)稍后在我的视图控制器中有一个方法,当我们将该方法作为目标添加到某个按钮时,我们可以说

button.addTarget(self, selector:ViewController.buttonTapped(self), forControlEvents: .TouchUpInside)
Run Code Online (Sandbox Code Playgroud)

Bry*_*hen 10

过时了.请参阅ClausJørgensen对Swift 2.2+ 的回答

Swift中没有"selector"的概念.理想情况下,闭合应该用于此目的.

你真正想要的是这样的

button.addAction(forControlEvents: .TouchUpInside) {
   // watch out for retain cycle, use weak or unowned accordingly
    ViewController.buttonTapped(self)
}
Run Code Online (Sandbox Code Playgroud)

并且您可以使用此代码(未经测试,但它应该给您一个起点)

public class ClosureWrapper : NSObject
{
    let _callback : Void -> Void
    init(callback : Void -> Void) {
        _callback = callback
    }

    public func invoke()
    {
        _callback()
    }
}

var AssociatedObjectHandle: UInt8 = 0

extension UIControl
{
    public func addAction(forControlEvents events: UIControlEvents, withCallback callback: Void -> Void)
    {
        let wrapper = ClosureWrapper(callback)
        addTarget(wrapper, action:"invoke", forControlEvents: events)
        // as @newacct said in comment, we need to retain wrapper object
        // this only support 1 target, you can use array to support multiple target objects
        objc_setAssociatedObject(self, &AssociatedObjectHandle, wrapper, objc_AssociationPolicy(OBJC_ASSOCIATION_RETAIN_NONATOMIC))
    }
}
Run Code Online (Sandbox Code Playgroud)

并且希望在将来发布的SDK中,Apple会添加类似的方法而不是选择器,所以我们不需要自己实现它们.


Cla*_*sen 2

Swift 2.2 使用#selector语法进行编译时检查选择器,请参阅https://swift.org/blog/swift-2-2-new-features/Using Swift with Cocoa and Objective-C (Swift 2.2)

对于您的示例,它将这样写:

button.addTarget(self, selector: #selector(ViewController.buttonTapped(_:)), forControlEvents: .TouchUpInside)