Swift是一門新的語言,不過現(xiàn)在已經(jīng)出到Swift4了,很多人想學(xué)Swift,不知從何開始,今天我就簡單說下入門知識,我認為在學(xué)習(xí)Swift之間最好先把這些基本的知識掌握了,才能更好的去認識它學(xué)習(xí)它,使用它.
全是干貨,并且附上demo:Swift開發(fā)進階知識(01)demo.
閱讀順序:
Swift開發(fā)入門-基礎(chǔ)知識.
Swift開發(fā)入門-進階知識(一).
Swift開發(fā)入門-進階知識(二).
開始 --- Swift --- Coding
一、Swift進階知識須知
- 我在上一篇文章中簡單介紹了一下基礎(chǔ)知識,認真看完基礎(chǔ)知識后,大多數(shù)人應(yīng)該可以試著開發(fā)一個小demo.
- 但是想寫一個功能性的demo,還是不行的,還是有很多東西我們需要了解.
- 在看這篇文章(demo)前,我建議把入門的基礎(chǔ)知識先了解一下.參考鏈接:http://www.itdecent.cn/p/3b01707fed18
二、閉包的基本格式
閉包是swift中常用的一個知識點
閉包和OC中的block類似
- 閉包是提前定義的一段可以執(zhí)行的代碼塊
- 可以當(dāng)做參數(shù) 在函數(shù)中傳遞
- 在需要的時候執(zhí)行代碼塊引用,完成回調(diào)的作用
- 在block中如果訪問到了self或者其屬性的時候,要注意考慮循環(huán)引用
我通過幾個例子來展示閉包的使用方法
1.沒有參數(shù)沒有返回值的閉包
//使用閉包來實現(xiàn)demo1A
//() -> ()沒有參數(shù)沒有返回值的閉包
func demo1B() {
let closure: () -> () = { () -> () in
print("我是一個沒有參數(shù)沒有返回值的閉包")
}
//執(zhí)行閉包
closure()
}
func demo1A() {
func sum(){
print("我是一個沒有參數(shù)沒有返回值的方法")
}
sum() //調(diào)用方法
}
2.有參數(shù)沒有返回值的閉包
- 閉包是一個封閉的結(jié)構(gòu):閉包的參數(shù),返回值 和閉包需要執(zhí)行的代碼片段都應(yīng)該在閉包的內(nèi)部
- in 是一個分割的標記
//使用閉包來實現(xiàn)demo2A
func demo2B() {
let closure = { (a: Int,b: Int) -> () in
let res = a + b
print(res)
}
//執(zhí)行閉包
closure(2, 3)
}
func demo2A() {
func sum(a: Int,b: Int){
let res = a + b
print(res)
}
sum(a: 2, b: 3) //執(zhí)行
}
3.有參數(shù)有返回值的閉包
func demo3B() {
let closure = { (a: Int,b: Int) -> Int in
let res = a + b
return res
}
//執(zhí)行閉包
//回調(diào)結(jié)果應(yīng)該放在參數(shù)部分還是返回值部分??
//放在參數(shù)部分來進行回調(diào)
let res = closure(3, 3)
print(res)
}
三、閉包的調(diào)用
- 閉包可作為函數(shù)的參數(shù)來調(diào)用,執(zhí)行回調(diào)
先寫兩個帶閉包參數(shù)的方法,一個只有閉包參數(shù),第二個還帶有一個非閉包的參數(shù)
//模擬網(wǎng)絡(luò)請求
func loadData(finishedCallBack: @escaping (String) -> ()) {
//1.在全局隊列中做耗時操作
DispatchQueue.global().async {
//在全局隊列中休眠
Thread.sleep(forTimeInterval: 1)
//2.在主隊列中回調(diào)數(shù)據(jù)
DispatchQueue.main.async {
//執(zhí)行閉包
finishedCallBack("哈哈哈哈哈哈哈哈哈")
}
}
}
func loadData(userName: String,finishedCallBack: @escaping (String) -> ()) {
//1.在全局隊列中做耗時操作
DispatchQueue.global().async {
//在全局隊列中休眠
Thread.sleep(forTimeInterval: 1)
//2.在主隊列中回調(diào)數(shù)據(jù)
DispatchQueue.main.async {
//執(zhí)行閉包
finishedCallBack("嘎嘎嘎嘎嘎嘎嘎")
}
}
}
閉包調(diào)用
//第一個函數(shù)
loadData { (result) in
print(result)
}
//第二個函數(shù)
loadData(userName: "小明") { (result) in
print(result)
}
- 當(dāng)最后一個參數(shù)是閉包的時候,可以形成尾隨閉包
尾隨閉包注意點:
1.系統(tǒng)會幫你簡寫,不需要coder手動簡寫
2.簡寫的規(guī)律:當(dāng)函數(shù)最后一個參數(shù)是閉包的時候,函數(shù)的參數(shù)的 '()' 會提前關(guān)閉
3.如果函數(shù)只有閉包一個參數(shù) '()'可以省略
四、 閉包的循環(huán)調(diào)用
閉包和OC的Block類似,都有可能造成循環(huán)引用
- 第一種方式: weak self 當(dāng)self被系統(tǒng)回收時,self的地址會自動指向nil
->和OC中的 __weak 類似 - 第二種方法: [unowned self]當(dāng)self被系統(tǒng)回收時,self的地址不會自動指向nil ,有可能導(dǎo)致壞地址,野指針
-> 和OC中的 __unsafe_unretained 關(guān)鍵字的作用類似
可選解包有什么作用呢?
->調(diào)用方法或者屬性的時候 使用可選解包,如果調(diào)用的對象為nil 就不會繼續(xù)執(zhí)行
解決方法:
//1.模仿OC的解決方式
func swiftMethodInOC() {
weak var weakSelf = self
loadData { (result) in
print(weakSelf?.view ?? "2")
}
}
//2.unowned
func swiftClosureMethod() {
loadData { [unowned self] (result) in
print(self.view)
}
}
五、Swift命名空間
我們在swift中調(diào)用其他類,不需要導(dǎo)入頭文件
- 這是因為swift支持命名空間
- 在同一個命名空間中(以項目為一個維度),默認所有的文件共享, 不需要導(dǎo)入頭文件
六、Swift面向?qū)ο蟮谋剡x屬性
新建一個Person類,并添加一個必選屬性: var name: String
新建一個Student類,繼承于Person類,并添加一個必選屬性: var number: String
Person類內(nèi)容:
class Person: NSObject {
var name: String
//override 重寫 面向?qū)ο蟮闹匾卣?父類已經(jīng)存在的方法或者屬性,子類需要做特殊的操作 可以重寫
//重寫的特點:在方法的內(nèi)部可以super
//構(gòu)造方法必須對 必選屬性 負責(zé),對象構(gòu)造成功之后,必選屬性必須有值
//對象的初始化分段進行,先初始化子類(給必選屬性賦值),再初始化父類
//super.init 是對象構(gòu)造結(jié)束的標記
override init() {
//在隱式生成super.init 之前沒有給self.name設(shè)置初始值,會報錯
name = "小明"
super.init()
/*
下面這個寫法會報錯,先寫
super.init()
name = "1"
*/
memeda()
}
//添加一個對象方法
func memeda() {
print("么么噠")
}
}
student類:
class Student: Person {
var number: String
override init() {
number = "001"
super.init()
}
}
調(diào)用:
func fiveDemo() {
let p = Person()
print(p.name)
let s = Student()
print(s.number,s.name)
}
所有的關(guān)于必選屬性的說明,都在代碼的注釋里面,不贅述.
總結(jié)
相較于上一篇文章Swift開發(fā)入門-基礎(chǔ)知識(一),這稍微有點難度,但是在開中,這些都是基本技能,是入門知識.
學(xué)習(xí)swift還有一個很好的教材,那就文檔,很多不喜歡看文檔最主要的原因是因為,看不懂英文.還好swift有中文版的文檔:swift4中文文檔
配合學(xué)習(xí),加油 加油!!!
最后,附上這篇文上所有代碼的demo: Swift開發(fā)進階知識(01)demo.