swift学习笔记

1.swift类的构造器

 swift构造器有三种:指定构造器和, 便利构造器, 默认构造器. 其中用'convenience'修饰的构造器为便利构造器, 继承自父类的构造器及swift自动提供的构造器为默认构造器, 其他为指定构造器. 指定构造器一般只有一个, 也可以有多个.
 所有便利构造器内部都必须调用本类的便利构造器或指定构造器, 但最终要调用本类指定构造器
 当子类有异于父类的构造器时(一般是指定构造器, 因为子类的便利构造器最终都要调用子类的指定构造器), 子类中所有的默认构造器不可用.
为什么swift要在以上情况下强制默认构造器不可用呢?
声明一个属性时不设置默认值, 就必须在构造器中设置

swift学习笔记_第1张图片
E04CDF10-16CE-4AEB-9133-8689A3D5B924.png

即初始化前所有属性都必须要有一个值(特殊情况除外, 如lazy, 可选类型等)
如果子类实现了自己的指定构造器, 很可能是为了初始化子类独有的属性, 那么父类的构造器就不适合子类了, 所以就强制不可用.
但是有些构造器是有独特的作用的, 比如init?(coder aDecoder: NSCoder)方法, 于是父类用required修饰这个构造器, 需要程序猿必须要实现.

swift学习笔记_第2张图片
90F841D7-0520-4D34-A738-1D5CBB036030.png

至于init?(coder aDecoder: NSCoder)是干什么用的, 呵呵, 一直在用loadNibNamed方法的我也有点蒙圈......

参考资料:http://stackoverflow.com/questions/25126295/class-does-not-implement-its-superclasss-required-members

2.swfit只读属性

setter getter方法重写如图, 如果只有get没有set就是只读属性, 但是有set的话就必须要有get

swift学习笔记_第3张图片
2D2148F3-0B0A-4378-A3EC-092B36667F85.png

3.你不可以为继承来的常量存储型属性或继承来的只读计算型属性添加属性观察器。这些属性的值是不可以被设置的,所以,为它们提供 willSetdidSet实现是不恰当。此外还要注意,你不可以同时提供重写的 setter 和重写的属性观察器。如果你想观察属性值的变化,并且你已经为那个属性提供了定制的 setter,那么你在 setter 中就可以观察到任何值变化了。
swift学习笔记_第4张图片
D69CE970-5C54-4242-ADC8-9EF696050F16.png

3.swift 访问权限

1、private
private访问级别所修饰的属性或者方法只能在当前类里访问。
2、fileprivate
fileprivate访问级别所修饰的属性或者方法在当前的Swift源文件里可以访问。
3、internal(默认访问级别,internal修饰符可写可不写)
internal访问级别所修饰的属性或方法在源代码所在的整个模块都可以访问。
如果是框架或者库代码,则在整个框架内部都可以访问,框架由外部代码所引用时,则不可以访问。
如果是App代码,也是在整个App代码,也是在整个App内部可以访问。
4、public
可以被任何人访问。但其他module中不可以被override和继承,而在module内可以被override和继承。
5,open
可以被任何人使用,包括override和继承。
访问顺序:
现在的访问权限则依次为:open,public,internal,fileprivate,private。

转自: https://www.jianshu.com/p/ee4a45e96570

需要说明的是, 对类/结构体使用低访问权限, 类/结构体的属性依旧可以使用高权限修饰. 当然, 一般类如果不能访问, 其属性也不能访问.

  • 任何属性或类的权限, 不得高于其类型或父类的权限
  • 任何方法, 其权限不高于其参数与返回值类型的访问权限

有错望指正, 谢谢.

你可能感兴趣的:(swift学习笔记)