在swift开发语言中,访问修饰符就fileprivate、private、internal、public 、open这五种。其中fileprivate和open是swift3中添加的;由于之前的swift对于访问控制是基于文件的,在swift3中就出现问题,就添加两个修饰符对原来的private和public进行细分,是的swift访问更加灵活,程序耦合行降低。
1、private:所修饰的属性或者方法,只能在当前的类中访问。
2、fileprivate:访问级别所修饰的属性或者方法在当前的swift源文件里可以访问;
3、internal:默认属性,在这个源代码所在的模块或者整个APP代码都可以访问。当时框架或者库代码则在这个框架内部都可以访问,框架外部引用时则不可以。
4、public:公共的,可以被任何使用。但是其他module中不可以被override和继承,而在module内可以被override和继承。
5.open:可以被任何人使用,包括override和继承。
5中修饰访问权限排序:
open>public>interal>fileprivate>private
lazy:懒加载、延迟加载或者惰性初始化属性 。一些对象的属性和内容非常复杂时,在构建对象时同时属性和会被创建分配内存,这样和会消耗不少时间;另外有些对象最初不会立即使用到,默认会创建时就会初始化,这样无疑也是一种浪费对性能影响也会较大;一次lazy关键字的使用是很常见的优化方法,有助于代码维护。
lazy在为属性修饰符,只能修饰变量,变量关键字var,使用let的常量实例化时赋值;使用场景是一个对象的属性依赖于其它属性。
swift中有两种实现机制:
简洁代码,只需要一行即可实现,声明格式:lazy var 变量名:类型
- lazy var tableView:UITableView = UITableView()
若想做些逻辑上的处理,swift中允许在属性后面定义一个闭包,闭包返回值是默认值;必须注意最后的小括号,只有加了小括号,闭包才会调用立刻执行;使用[unowned self]避免循环使用
2. lazy var tableView:UITableView = {[unowned self] in
let tableView = UITableView(frame: CGRectMake(0, 0, SCREENW,SCREENH),style:UITableViewStyle.Plain)
tableView.separatorStyle = UITableViewCellSeparatorStyle.None
tableView.showsVerticalScrollIndicator = false
tableView.contentSize = CGSizeMake(SCREENW + 50, SCREENH - 49)
return tableView
}()