Swift3.0基础知识点

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

推荐阅读更多精彩内容