一.前言
為什么要學(xué)Swift呢栗恩?作為蘋果開發(fā)應(yīng)該都知道,以后可能是使用Swift來開發(fā)iOS App了(雖然洪燥,Swift原作者貌似跳槽到了特斯拉磕秤,但是這不是我們需要關(guān)心的八卦),當(dāng)然也可能使用H5+Native捧韵,不管怎么樣市咆,這篇文章要說的是Swift。(黑人?臉)
二.經(jīng)歷實踐得出的一些經(jīng)驗
(1)初始化
1.子類重寫父類初始化器需要添加Override關(guān)鍵字
2.自定義的指定初始化器里需要先保證當(dāng)前類所有儲存屬性都有初始值再来,然后才能調(diào)用父類指定初始化器
3.自定義指定初始化器系統(tǒng)就不會添加默認初始化器蒙兰。PS:UIViewController里面并沒有init()初始化器磷瘤,所以子類的init()初始化器算是自定義的初始化器
4.帶required關(guān)鍵字的都需要子類重寫
5.子類繼承了父類指定的初始化器,就可以調(diào)用父類里調(diào)用該指定初始化器的便利初始化器
(2)搜变?vs ! vs ??
?:可選類型采缚,可以為nil,不會報運行時錯誤挠他。
var name: String? //nil
name = "Jashion"
print("\(name!)")
!:可選強制類型扳抽,如果值為nil時會報運行時錯誤;如果對象一單初始化則一直會有值殖侵,則可以用!摔蓝。
var name: String! = "Jashion"
let jashion = name!
print("\(jashion)")
??:判斷符,比如:a ?? b愉耙,如果a為nil則返回b,否則返回a拌滋。
let result: String? = nil ?? "Jashion"
print("\(result!)") . //Jashion
(3)as vs as? vs as!
as: 使用場合
1.向上轉(zhuǎn)型朴沿,從派生類轉(zhuǎn)換為基類
class SuperClass {
var name: String? = "Jashion"
}
class SubClass: SuperClass {
var number: Int? = 10
}
let subClass = SubClass()
let superClass = subClass as SuperClass
superClass.name . //Jashion
superClass.number //Error
2.消除二義性,比如數(shù)值轉(zhuǎn)換
let floatNum = 42 as CGFloat
let intNum = 42 as Int
let intNum2 = (42/5) as Int
let doubleNum = (42/5) as Double
3.switch語句中進行模式匹配(如果不知道一個對象是什么類型败砂,可以通過switch語法檢測它的類型赌渣,并且嘗試在不同的情況下使用對應(yīng)的類型進行相應(yīng)的處理)
let animal: Animal = Cat()
switch animal {
case let cat as Cat:
print("cat")
case let dog as Dog:
print("dog")
default:
break
}
總的來說,左邊是右邊的子類或者是同類才能轉(zhuǎn)換昌犹,就是只能向上轉(zhuǎn)型坚芜。
as?使用場合
向下轉(zhuǎn)型(Downcasting)時使用。如果轉(zhuǎn)換不成功則返回nil斜姥,不會報運行時錯誤鸿竖。
let animal: Animal = Cat()
if let cat = animal as? Dog {
print(cat)
} else {
print("something") //something
}
as!使用場合
和as?使用差不多,不過是強制轉(zhuǎn)換铸敏,如果為nil則會報運行時錯誤缚忧。
Class Animal{}
Class Cat: Animal{}
let animal: Animal = Cat()
let cat = animal as! Cat
(4)is vs as
is只是單單判斷該對象是不是某個類型的實例
as不僅僅判斷類型,如果是該類型還會強制轉(zhuǎn)換成該類型
let cat: Cat = Cat()
let animal = cat as Animal //Animal
let isCat = cat is Cat //true
(5)mutating可變類型
枚舉和結(jié)構(gòu)體是值類型杈笔,和OC不一樣闪水,枚舉和結(jié)構(gòu)體可以定義自己的方法,但是蒙具,默認情況下方法不能修改值類型的屬性球榆。在方法之前添加mutating關(guān)鍵字可以在方法中修改值類型的屬性。
struct Person {
var name: String = "Tome"
var score: Int = 99
mutating func changeScore() {
score = score+12
}
}
(6)類方法
在方法func前面添加關(guān)鍵字static禁筏,來指定類方法持钉。添加class關(guān)鍵字來允許子類重寫父類的類方法。
class Animal {
static func animal() {
print("Is animal!")
}
class func animalName(_ name: String) {
print("Animal is \(name)")
}
}
Animal.animal()
Animal.animalName("Cat")
class Cat: Animal {
override static func animalName(_ name: String) {
print("Animal is \(name)")
}
}
(7)Swift訪問控制
Swift訪問控制級別遵循一個基本原則:不允許將實體定義在限制性更強的實體內(nèi)篱昔。
class Animal {
var name: string?
}
public var cat = Animal()
//error: variable cannot be declared public because its type 'Animal' uses an internal type
public func animal(_ animal: Animal) {}
//error: function cannot be declared public because its parameter uses an internal type
public func animal() -> Animal {}
//error: function cannot be declared public because its result uses an internal type
訪問級別從開放到私有排序:
open > public > internal > fileprivate > private
1.private
訪問級別最低右钾,只能類內(nèi)部訪問
class A {
private fund test() {
print(“this is private function!")
}
}
class B: A {
fun show {
test() //Error:只能類內(nèi)部訪問
}
}
2.fileprivate
在當(dāng)前的源文件都可以訪問。
//demo.swift
class A {
fileprivate func test() {
print(“this is private function!")
}
}
class B: A {
fun show {
test() //Right
}
}
3.internal(默認訪問級別,不需要額外設(shè)置舀射。)
internal訪問級別所修飾的屬性或者方法在源代碼所在的整個模塊內(nèi)部都可以訪問窘茁,比如:整個App,某個框架脆烟。
4.public
可以被任何人訪問山林,但是其他模塊中,不可以繼承和重寫邢羔,模塊內(nèi)可以被繼承和重寫
5.open
可以被任何人訪問驼抹,繼承和重寫
(8)對于調(diào)用的函數(shù)有返回值但是本身不需要使用可以使用“-”代替。
_ = self.navigationController?.popViewController(animated: true)
(9)添加seletor
backButton.addTarget(self, action: #selector(DetailViewController.back), for: .touchUpInside)
//DetailViewController是類名拜鹤,back是方法
//如果需要調(diào)用的是私有方法框冀,則需要在私有方法前面添加@objc字段
(10)寫轉(zhuǎn)場動畫的坑(Push/Pop)
//動畫開始的函數(shù)調(diào)用順序
Objective-C:init()->loadView()->animationControllerForOperation()->animateTransition
swift: init()->animationControllerForOperation()->loadView()->animateTransition
//因為我的轉(zhuǎn)場動畫需要用到下一個scene的imageView,所以控制器的視圖必須初始化敏簿,然后就發(fā)現(xiàn)Swift和Objective-C函數(shù)的調(diào)用順序不同明也,略坑
三.總結(jié)
初次使用Swift的感覺就是,很強大惯裕,很簡潔温数,但是,正因為強大蜻势,細節(jié)上注意的東西比較多撑刺,很多東西其實上手也需要時間,比如握玛,現(xiàn)在我都對Swift的閉包不是弄的很懂够傍,雖然和Objective-C的block差不多,但是還是有區(qū)別的挠铲⊥醮總而言之,路還很漫長市殷。
最后愕撰,獻上自己用Swift寫的轉(zhuǎn)場動畫Demo。