10.swift5-常見語法及內存管理

常見語法

參數

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)

}

枚舉是個值類型,和結構體一樣


10.swift5-常見語法及內存管理


10.swift5-常見語法及內存管理


10.swift5-常見語法及內存管理


靜態函數調用

swift要調用不同文件中的func,需要將文件放在同一目錄,如果要將常量區分來看來,可以對常量類右鍵選擇 New Group from Selection

內存管理

swift的內存管理是計算管理(automatic reference counting,ARC),有人引用計數+1,離開引用區,計數-1,變為0後就立刻移除,ARC有三種類型

strong,就是指該對象一直在堆的內存中,是默認類型

weak,弱引用對象的引用計數不會+1,必須為可選變量

[if !supportLists]3.[endif]unowned,這是一個危險類型,無主引用,不把它算到引用計數里,非常少被使用,例如我使用了堆裡的某個對象,但是不要把它算作強引用,我保證我從來不會在這個對象釋放後再去使用。我們很難說我比機器更明白此時對象是否在堆中,唯一使用的情況是用來避免引用循環。引用循環是說堆中有個對象引用了另一個對象,另一個對象又引用了該對象,這樣就把對方留在了堆中。swift通常只有在閉包時會出現循環引用


分享到:


相關文章: