常見語法
參數
Swift中帶參數的函數的一般寫法是這樣的:
func someFunction(firstParameterName: Int, secondParameterName: Int) {
//在函數體內,firstParameterName 和 secondParameterName 代表參數中的第一個和第二個參數值
}
調用該函數時,寫法是:
someFunction(firstParameterName: 1, secondParameterName: 2)
但有時我們一些函數的參數前有一個“_”,類似這樣:
func someFunction(_ firstParameterName: Int, secondParameterName: Int) {
//在函數體內,firstParameterName 和 secondParameterName 代表參數中的第一個和第二個參數值
}
那麼這個“_”是什麼意思呢,看看函數的調用就知道了:
someFunction(1, secondParameterName: 2)
“_”是代表函數調用時,可以忽略參數名稱。
常見語法
nil是代表可選的缺省值
定義結構體:strct Card {}
結構體是值引用,每次都是拷貝一個,但是是寫時複製,也就是用的時候複製
類是引用類型,就是其他語言中傳遞的是指針,直接指向堆棧中的對象
實例變量初始化空數組:var card = Array()或者var cards = [Card](), ()就是調用構造器,初始化的意思
0-100遍歷: for i in 0...100 {}
數組遍歷:for (index, title) in titles.enumerated() {}
數組新增元素除了append還可以用+=, card += [card,card]
var variableName = 42
var varB:Float
varB = 4.13
private lazy var scrollView: UIScrollView = {}
變量前加?表示如果沒有初值就是nil,加!表示明確這個變量一定有值,如果為空就會crash
extension,擴展可以新增功能,但不能覆蓋現有的功能
與if語句相同的是,guard也是基於一個表達式的布爾值去判斷一段代碼是否該被執行。與if語句不同的是,guard只有在條件不滿足的時候才會執行這段代碼。你可以把guard近似的看做是Assert,但是你可以優雅的退出而非崩潰。
let表示不可變對象,也就是說內存地址不能改變,但也可以修飾可變對象
var表示可變對象
在閉包裡面為了解決循環引用問題,使用了`[unowned self]`。如果回調在self已經被釋放後再調用,會導致crash掉。
解決:使用weak修飾。
weak與unowned的區別:
unowned設置以後即使它原來引用的內容已經被釋放了,它仍然會保持對被已經釋放了的對象的一個 "無效的" 引用,它不能是 Optional 值,也不會被指向 nil 。如果你嘗試調用這個引用的方法或者訪問成員屬性的話,程序就會崩潰。而 weak 則友好一些,在引用的內容被釋放後,標記為 weak 的成員將會自動地變成 nil (因此被標記為 @ weak 的變量一定需要是 Optional 值)。
元組:let x: (String, Int, Double) = (“hello”,5,0.8),
let (word, number,value) = x
print(word) print(number) print(value)
let x:(w:string, i:int,v:Double) = (“hello”,5,0.8),
print(x.w), print(x.i) print(x.v)
fileprivate文件內可以互相訪問
字典: var pantry:[String: Int] = [:]
panty[“apple”] = 2
panty = [“apple”:5,”pears”:3, “oranges”:4]
for (food, quantity) in panty { }
類型
swift的Optional類型其實是枚舉類型,
enum Optional
case none
case some(
}
Optional通常有兩種類型,一種是none,一種是關聯某個類型(some
var hello:String? ==> var hello: Optional<string> = .none/<string>
ex:
let hello: String? = ...
print(hello!)相當於強制解包,也就是
switch hello {
case .none: //raise an exception(crash)
case .some(let data): print(data)
}
var hello: String!
print(hello)同上面的switch是一個意思
var hello:String?=”hello” ==> var hello: Optional<string> = .some(“hello”)/<string>
var hello:String?=nil ==> var hello: Optional<string> = .none/<string>
enum : enum food {
case fires
case dink(size: FryOrderSize)
case cookie(String, ounces:Int)
}
枚舉是個值類型,和結構體一樣
靜態函數調用
swift要調用不同文件中的func,需要將文件放在同一目錄,如果要將常量區分來看來,可以對常量類右鍵選擇 New Group from Selection
內存管理
swift的內存管理是計算管理(automatic reference counting,ARC),有人引用計數+1,離開引用區,計數-1,變為0後就立刻移除,ARC有三種類型
strong,就是指該對象一直在堆的內存中,是默認類型
weak,弱引用對象的引用計數不會+1,必須為可選變量
[if !supportLists]3.[endif]unowned,這是一個危險類型,無主引用,不把它算到引用計數里,非常少被使用,例如我使用了堆裡的某個對象,但是不要把它算作強引用,我保證我從來不會在這個對象釋放後再去使用。我們很難說我比機器更明白此時對象是否在堆中,唯一使用的情況是用來避免引用循環。引用循環是說堆中有個對象引用了另一個對象,另一個對象又引用了該對象,這樣就把對方留在了堆中。swift通常只有在閉包時會出現循環引用
閱讀更多 北落師門Orz 的文章