我想知道我们可以在swift中实现强类型选择器吗?例如,如果我buttonTapped(sender: AnyObject)
稍后在我的视图控制器中有一个方法,当我们将该方法作为目标添加到某个按钮时,我们可以说
button.addTarget(self, selector:ViewController.buttonTapped(self), forControlEvents: .TouchUpInside)
Run Code Online (Sandbox Code Playgroud)
Bry*_*hen 10
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会添加类似的方法而不是选择器,所以我们不需要自己实现它们.
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)
归档时间: |
|
查看次数: |
940 次 |
最近记录: |