TOP

ios -- 教你如何轻松学习Swift语法(三) 完结篇(一)
2017-10-13 09:53:05 】 浏览:10063
Tags:ios 如何 轻松 学习 Swift 语法 完结

前言:swift语法基础篇(二)来了,想学习swift的朋友可以拿去参考哦,有兴趣可以相互探讨,共同学习哦. 
 

 
一.自动引用计数
 
1.自动引用计数工作机制
     1.1 swift和oc一样,采用自动引用计数来管理内存
     1.2 当有强引用指向对象,对象的引用计数 +1 , 强引用消失,自动计数 -1
     1.3 如果对象的引用计数为0 , 那么该对象会被销毁
 
2.循环引用
     2.1 什么是循环引用?
          两个(或多个)对象互相强引用
 
     2.2 循环引用对项目有什么影响
          循环引用会让对象不会被销毁,一直保存在内存中,可能导致项目运行不畅
     
     2.3 怎么解决强引用问题?
          只需要让其中一个对象对另外一个对象的引用变为弱引用即可
          在swift中用waek 相当于OC中的 __weak ,或者使用 unowned 相当于OC中的 __unsafe_unretained
 
3.weak 和 unowned的区别
     3.1 相同点:
          都是一个弱引用,不会对对象进行retain
     
     3.2 不同点
          3.21 weak(__weak) :当弱引用指向的对象销毁时,该引用会指向nil   所以用weak指向的数据类型为可选类型
          3.22 unowned(__unsafe_unretained) :当弱引用指向的对象销毁时,依然指向原来的内存地址, 容易产生错误(野指针/访问僵尸对象)
          3.23 unowned不支持可选类型
 
二.可选链
 
1.什么是可选链?
     简单的说,就是可选类型的对象组成的链条
 
2.为什么会产生可选链?
     2.1 假设有三个类, 人,狗,玩具   
     2.2 人里面有狗这个属性,狗里面有玩具这个属性, 玩具里面有价格这个属性
     2.3 把玩具这个对象赋值给狗(让狗拥有玩具), 把狗这个对象赋值给人(让人拥有这只狗)
     2.4 想要通过人来修改玩具的价格,就需要 person.dog.toy.price 来修改
     2.5 person.dog这个值得类型是可选类型 ,因为人的狗属性可能为nil   属性,想要使用person.dog ,必须要强制解包
     2.6 person.dog.toy也是可选类型,像这样由可选类型的对象组成的链条就是可选链
     
3.可选链注意点
     3.1 利用可选链赋值的时候一定要解包
     3.2 利用可选链取值的时候也不要忘记解包
     3.3 利用可选链调用方法的时候 也要先解包
 
4.利用可选链赋值, 取值,调用方法
     4.1 给可选链赋值:
1  person.dog!.toy!.price = 50 太危险  强制解包,如果没值,直接程序崩溃
2  
3 if let dog = person.dog {
4     if let toy = dog.toy {
5         toy.price = 50
6     }  这样解包虽然安全,但是太麻烦
7 }
苹果在swift中推荐使用这种方式来给可选链赋值
1 person.dog?.toy?.price = 50 
2 //当person.dog 为nil的时候,后面的操作就不再执行
 
     4.2 从可选链取值: 从可选链中取出的值得类型一定是可选类型 (有可能取不到)
let price = person.dog?.toy?.price
 
     4.3 可选链调用方法:系统会自动判断可选类型是否有值
person.dog?.toy?.flying()
 
三.协议
 
1.如何定义协议
 
     1.1 swift中协议的方式和类,结构体,枚举相似
protocol SomeProtocol {
    // 协议方法
}
 
     1.2 例如:定义一个运动协议
1 protocol SportProtocol {
2     func playBasketball()
3     func playFootball()
4 }
 
2.声明一个类,并且遵守协议
     2.1 声明一个基类(不继承其它类),并遵守协议
 1 class SomeClass:FirstProtocol,AnotherProtocol {
 2     // 类的内容
 3     // 实现协议中的方法
 4 }
 5  
 6      例如:
 7 class Person : SportProtocol {
 8     var name : String = ""
 9    
10     func playBasketball() {
11         print("打篮球")
12     }
13    
14     func playFootball() {
15         print("踢足球")
16     }
17 }
 
     2.2 类继承自其他类,并遵守协议
1 class SomeClass:SomeSuperClass, FirstProtocol,AnotherProtocol {
2     // 类的内容
3     // 实现协议中的方法
4 }
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇iOS 学习 - 19.结构体 下一篇Swift - 多个mask的动画效果