Swift 中 Selector 方法的访问权限控制问题
来源:互联网 发布:nginx访问图片 编辑:程序博客网 时间:2024/04/30 01:11
今天用Swift写了个视图,在视图上加个手势,如下所示:
panGestureRecognizer = UIPanGestureRecognizer(target: self, action: "beginDragged:")addGestureRecognizer(panGestureRecognizer)
运行了下程序,然后崩溃了。崩溃日志如下:
[**.SwipeCardView beginDragged:]: unrecognized selector sent to instance 0x125e5bc10
而我已经在SwipeCardView类中定义了beginDragged:方法,如下所示:
private func beginDragged(gestureRecognizer: UIPanGestureRecognizer) { // ....}
由于我并不想将beginDragged:方法暴露出去,所以将其定义为一个private方法。方法的定义一切正常,手势的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修饰符。
参考
SELECTOR
@selector() in Swift?
0 0
- Swift 中 Selector 方法的访问权限控制问题
- Swift 中 Selector 方法的访问权限控制问题 @objc
- Swift-Selector方法的扩展
- swift的访问控制
- Swift中Selector的用法
- JAVA中访问权限的控制
- Java中访问权限控制
- Java中访问权限控制
- java中访问控制权限
- Java中访问权限控制
- Java中访问权限控制
- ios 的 字段、方法、属性的访问权限控制
- 关于访问权限控制的几点问题
- 从一个问题看MySQL的权限访问控制
- java中访问权限的问题
- 在Swift 中 “方法访问”
- 文件的访问权限控制
- Java访问权限的控制
- composer的安装-ubuntu
- android流式布局--流式标签
- eclipse报错:This Android SDK requires Android Developer Toolkit version 23.0.0 or above.
- maven工程导入后pom.xml报错问题
- Android关于email的详细配置
- Swift 中 Selector 方法的访问权限控制问题
- 急性子的开源大数据,第 1 部分: Hadoop 教程:Hello World 与 Java、Pig、Hive、Flume、Fuse、Oozie,以及 Sqoop 与 Informix、DB2 和
- 常用工具类(日志、Toast、SPUtils、单位转换类、 DensityUtils、SDCardUtils、ScreenU、App相关辅助类、KeyBoardUtils、NetUtils、Http)
- SSH框架学习(四、struts+spring搭建,spring注解注入)
- Linux之/et/sysctl.conf配置文件详解
- 初识Cocos2d-JS (一)
- 创建一个流畅循环的UIScrollView
- Swift 中 String 与 CChar 数组的转换
- 公钥,私钥,SSL(讲的很生动)