总结一下使用Swift遇到的几个小问题和几个小知识点

来源:互联网 发布:linux虚拟机建立文件夹 编辑:程序博客网 时间:2024/05/16 10:19

总结一下使用Swift遇到的几个小问题和几个小知识点

Swift的内省机制

之前在OC中使用isKindOfClass, 但在Swift中却没有这个方法, 后来了解到这是Swift的内省机制,用 is 代替。

Swift 使用kvc

踏过一个坑, 在利用setValueForKey 赋值的时候,直接崩溃了,在类中寻找不到相应的key,后来搜了一下,明杰大神提到过。(具体文章名字忘记了。sorry。。。)

Swift中的框架类型,如果要用到KVC,不要使用Int?、Float? 、Double? 这样的类型。如果一定要用,请使用NSNumer?当前这样,你的数据类型就模糊化了。不能看到真正的类型。

1.如果是String 或者NSString :请定义为可选,且只有字符串可选。(因为json中String类型最多,不赋初始值省事)。
2.Int、CGFloat、Float、Double、Bool、自定义对象 一定不能定义为可选,并全部初始化。

Swift中的 ??操作符

swift中的??操作符的含义是 操作符左面是一个Optional 类型, 右面是一个普通值, 当左侧Optional 不为nil时,返回左边拆包之后的值,如果为nil, 返回右侧的值。
总结了一下,两端类型有各式各样的。在?? 符号 左右两端元素类型不相同时, 如果是print() print中的类型自动向上转型为Any 如若为 let 赋值, 左右两端元素的类型自动向上转看是否有相同的父类。 如果没有编译失败, 如果有编译成功。(主要看两端是否有共同的父类)

Swift的访问权限

给button添加点击事件,既然是点击事件那就是Private,但是却报错找不到点击事件的方法。之前的解决办法是直接把Private 去掉,前几天看到的一篇文章。解答了我的困惑。

我们知道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 unowned 和 weak

在写一个栈内管理的时候,使用unowned 和 weak 试验了一下。 unowned 在使用时,若该对象被释放了,再去使用该对象时,会Crash , 而 weak 则会将该对象置为nil。

unowned引用是non-zeroing(非零的)
,这表示着当一个对象被销毁时,它指引的对象不会清零。也就是说使用unowned引用在某些情况下可能导致 dangling
pointers(野指针url)。

本文所有摘抄的文章段落,如有侵权,希望作者您告知,我立即把内容撤下。。

0 0
原创粉丝点击