美文网首页
Swift 中 Selector 方法的访问权限控制问题

Swift 中 Selector 方法的访问权限控制问题

作者: 逐水而上 | 来源:发表于2016-07-26 10:57 被阅读34次

原文在这里Swift 中 Selector 方法的访问权限控制问题,感觉写的很好,道理讲的简洁而明了,记录一下。

private func beginDragged(gestureRecognizer: UIPanGestureRecognizer) {
// ....
}

不想将beginDragged:方法暴露出去,所以将其定义为一个private方法。方法的定义一切正常,手势的Selector方法也设置正常,用#selector调用时却报了未找到方法的异常。那问题可能就应该在访问权限问题上了。

我们知道Selector是Objective-C的产物,它用于在运行时作为一个键值去找到对应方法的实现。一个Objective-C的方法是由objc_method结束体定义的,其声明如下:

struct objc_method {
SEL method_name OBJC2_UNAVAILABLE; // 方法名
char *method_types OBJC2_UNAVAILABLE;
IMP method_imp OBJC2_UNAVAILABLE; // 方法实现
}

这就要求selector引用的方法必须对ObjC运行时是可见的。而Swift是静态语言,虽然继承自NSObject的类默认对ObjC运行时是可见的,但如果方法是由private关键字修饰的,则方法默认情况下对ObjC运行时并不是可见的,所以就导致了以上的异常:运行时并没找到SwipeCardView类的beginDragged:方法。

所以,我们必须将private修饰的方法暴露给运行时。正确的做法是在 private 前面加上 @objc 关键字,这样就OK了。

@objc private func beginDragged(gestureRecognizer: UIPanGestureRecognizer) {
// ....
}

另外需要注意的是,如果我们的类是纯Swift类,而不是继承自NSObject,则不管方法是private还是internal或public,如果要用在Selector中,都需要加上@objc修饰符。

相关文章

网友评论

      本文标题:Swift 中 Selector 方法的访问权限控制问题

      本文链接:https://www.haomeiwen.com/subject/ktynjttx.html