swift3.0的简单知识点
1. optional里 let没有默认值 var 默认值是nil
2.三目运算跟oc一样:
let sanmu = 9
sanmu > 6 ? print("大了") : print("小了")
如果不想执行后面的 print("小了") 用()代替 // ()为执行空
3. ?? 简单的三目运算 如果前面有值 就用值 没有 就用后面的值
!!(1).注意 ??最好用 ()括起来 因为优先级低 (2).测试发现值必须是optional类型
4. if let/var 可以避免解包. 外部不能使用if let/var里创建的变量 ; guard let/var 如果变量为false 才走{} ,外部可以使用创建的变量,内部不可以使用新的变量
5. as 是做类型转换
6.形参列表3.0做了优化:
(1). func sum(x:Int,y:Int){} //基本函数
(2).func sum(value1 x:Int ,value2 y:Int){} //显示前缀
(3). func sum(_ x:Int,_ y:Int){} //不显示前缀
(4).func sum(x:Int=2,y:Int=3){}//设置默认值,设置默认值后 运用的时候可以不传值
(5).func sum(x:inout Int,y:inout Int)() //类型前加inout 可在函数内部改动形参值 传入的值为指针//&
(6).多个相同的类型的时候 可以在类型后面加... 实现用for遍历
(7). 函数类型 可以根据相同的类型返回不同函数
(8). 函数可嵌套使用 就是一个函数里可放多个函数
7. 闭包的使用:
(1). 先定义属性 var backClosure:((String)->Void)?
(2). 调用 self.backClosure(label.message?)
(3). 实现 self.backClosure = {(message:String)->Void in print(message!) } // {形参列表 + 返回值 + in + 打印}
8.weak 只能修饰var 不能修饰let ; 解包有两种方式: 1. ? 2. ! ,?不计算 !计算
9.防止循环引用的方法 (1)weak var weakSelf = self; (2){ [weak self] in print(self?.view)}; (3){[unowned self] in print(self.view)}.
10. (1).属性如果是对象,一般都是可选的 .在需要的时候创建,可避免写构造函数
(2).基本类型 要有默认值
(3).如果设置为private 外部就不能用了
11. guard 语法可避免强行解包
12.遍历构造函数: 只做判断,不做创建 如果设置属性需要放在创建之后
用法: convenience init?(){ self.init() kvc赋值 }
13. model类防止崩溃小技巧 :(1). 对象属性用可选"var",可以防止在构造函数里写初始化 (2). 基本类型属性设置初始值 (3).需要使用kvc设置的属性 不能添加private修饰符
14. as?和as! : 完全根据前面的类型来判断 如果是必须有的值 用as! 如果可选 用as?. if let 和 guard let 做类型转换的时候必须用as? 不然的话就不用做判断了
15. 闭包调用的时候用? 不要用! // block?() --问号可以判断是否存在
16. 懒加载 (1). lazy var tempLabel:LYTempLabel = LYTempLabel() //避免使用! ? 来区分是否已经创建 ;
(2). 全面点写法是 lazy var tempLabel = { ()->LYTempLabel in let label = LYTempLabel() return label }() ; (3). 只有在第一次运行时候创建一次 赋值给属性 =nil后再用不会再创建. 所以一般不要主动释放懒加载的属性
17. 反射机制 :NSClassFromString() 目的是为了解耦
18. try的用法 (1). try?//推荐使用 有值则返回值 没值则返回nil (2).try! 不推荐 没值崩溃 (3).do{ try....}catch{print(error)}
19. 枚举 enum XXXType{ case XXX case XXX }
20. 数组的闭包函数 :
var numberArr = [1,2,3,4,5,6]
(1). map (映射) numberArr.map{(number:Int)->Int in return number+1}
(2).filter (过滤器)numberArr.filter{ (value) -> Int in return value>2}
(3).reduce numberArr.reduce(0) { (value1, value2) -> Int in return value1+value2} return的值是结果 参数一是结果 参数二是值
21. description 的用法
override var description:String { let dic = [xx,xx,xx]//属性 return dictioinaryWithValues(forKeys:dic).description }
22. 子类如果没有构造函数 可以使用父类的构造函数,子类有构造函数,父类的便不能使用
23. subscript 用法 给对象添加个下标取值的方法 :
var number:[Int] = [] ; subscript(index:Int)->Int{ set{number[index] = newValue} get{ return number[index] } }
24. 协议 protocol 里 mutating func action() mutating作用: 可以在该方法里修改自己和自己的属性 类继承可以不用写 mutating , enum或struct 必须要有mutating
25. 协议构造器 声明: init(value:Int) 在类里的实现在构造器前必须加required, (如果类已经被标记为final 就不需要再构造器的实现中使用required 因为final类不能有子类)
26. flatMap 和map的区别 map把元素处理下返回可选的元素 flatmap 会过滤掉nil的元素 返回的元素是确定的 不是optional, 并且做了减维 [[1,2,3],[4,5,6]] .flatmap{return $0 +2} 返回的是 [3,4,5,6,7,8] map的话返回的是[[3,4,5],[6,7,8]]
27.访问权限依次是 open public internal fileprivate private swift3 新增open fileprivate
28. required用法 1、用于构造函数。2、子类如果有构造函数,必须实现父类标记required的构造函数。3、如果子类没有构造函数,不用实现父类的构造函数
29. convenience 修饰的初始化方法,子类需要重写父类在convenience里调用的初始化方法,才可以使用父类的convenience方法。如果想让父类的convenience方法可以一直使用,可以在指定的初始化方法前设置required