常量是定義是不可以修改的,在類中定義的常量,可以在構造函數中賦值。let修飾
變量是可以修改的。var修飾
字符串中字符的遍歷
for code in string {}
for codeunit in string.unicodeScalars {}
break 跳出循環體
continue 終止當前,進入下一個循環
label 配置break和continue使用;用label標記循環體,break label跳出標記的循環體,continue label 是進入下一個標記的循環
fallthrogh:switch語句中使用,用在case節點方法后面,作用是貫穿下一個case
switch語句中必須包含 default節點,case節點不需要使用break
number1…number2 == number1<=var<=number2
number1..<number2 == number1<=var<number2
var tuples = (int,string,obj,…)
Dictionary<KyeT,ValueT>
for (key,value) in Dictionary {}
for key in Dictionary.keys
for value in Dictionary.values
在字典復制時,取決于字典的value是值類型還是引用類型
func Function(params) -> params { 方法體 }
函數的參數默認是let 常量,需要變量需要在定義參數是,定義var
參數定義時,可以賦值默認值 func Test(paramens:String = "default value") {}
可變參數 func sum(numbers:Double…) 類似傳遞一個Array<T> 的參數
參數傳遞引用 inout 關鍵字
返回多值(返回一個元組類型的值)
函數本身可以作為參數傳遞,也可以作為范圍值
參數的內部名稱和外部名稱
定義在其他函數體中的函數
類似lambdas表達式
全局函數是一個有名字,但不會捕獲任何值得閉包
嵌套函數是一個有名字并且可以捕獲其封閉函數域內值得閉包
閉包表達式是一個利用輕量級語法所寫的可以捕獲其上下文中變量或常量的沒有名字的閉包
表達式:
{ (parameters) -> returntype in
statements
}
var numbers =[1,3,30,16,25,73,97]
func backwards(s1:String, s2:String) -> { return s1>s2 }
作為函數參數傳遞
sort(numbers,backwars)
閉包表達式傳遞
sort(numbers,{
(s1:String, s2:String) -> bool in
Return s1>s2
})
對于短的閉包可寫作一行
Sort(numbers,{(s1:String, s2:String) -> bool in return s1>s2})
閉包能自動推斷參數類型
sort(numbers,{s1, s2 in return s1>s2})
單行表達式可以省略return 關鍵字
sort(numbers,{s1,s2 in s1>s2})
參數名簡寫
sort(numbers,$0>$1)
運算符函數
sort(numbers,>)
尾隨閉包:把閉包作為最后一個參數傳遞給函數,就可以使用尾隨閉包
sort(numbers){
(s1:String, s2:String) -> bool in
Return s1>s2
})
Sort(numbers){$0>$1}
在swift中只有類似引用類型,其他都是值類型
定義屬性
定義方法
定義下標
定義構造器
擴展方法(external)
遵循協議(PRotocol)
類允許繼承
類型轉換允許在運行時檢查和解釋一個類型實例的類型
析構允許一個類實例釋放任何其被分配的資源
引用計數允許對一個類的多次引用
可以通過閉包和函數來設置屬性默認值
存儲在特定類或結構的實例里的一個常量(let 定義)或變量(var 定義)
定義一個常量的結構體屬性,該結構體的所有屬性也就變成了常量,對已引用類型的class則不一樣,把一個class的實例賦給一個常量后,仍然可以修改實例的變量屬性
用@lazy 來表示一個延時存儲屬性,延時存儲屬性必須用 var聲明;當屬性的值依賴在實例的構造過程前無法知道具體值的外部因素,或者當屬性的值需要復雜大量的計算是,可以只在需要的時候來計算
計算屬性不直接存儲值,而是提供一個getter來獲取值,一個setter來間接設置其他屬性或者變量的值。在setter中默認使用newValue表示接收的值
就是只有getter的計算屬性
willSet 在設置新的值之前調用。默認使用newValue表示新值
didSet 在新的值被設置之后立即調用。默認使用oldValue表示舊值
計算屬性和屬性監聽器所屬的模式也可以用于全局變量和局部變量,全局變量是在函數、方法、閉包或任何類型之外定義的變量,局部變量是在函數、方法或閉包內部定義的變量
全局的常量或變量都是延遲計算的,跟延遲計算屬性相似,不同的地方在于,全局的變量或者常量不需要標記@lazy特性;局部范圍的常量或者變量不會延遲計算。
類型屬性用于定義特定類型所有實例共享的數據
對于值型類(枚舉和結構)可以定義存儲和計算型類型屬性,對于class則只能定義計算型類型屬性
在枚舉和機構中用static 聲明一個類型屬性
在class中用class聲明一個類型屬性
值類型的屬性不能在他的實力方法中被修改,如果確定需要修改某個具體值類型的屬性,可以選擇變異方法(用 mutating 聲明的方法),然后方法就可以從方法內部修改它的屬性
于類型屬性相同
語法:
subscript(parameter:parametertype) -> returntype {
get{
}
set(newValue){
}
}
在類和結構中定義變量或常量屬性必須必須在構造器中賦值,或者在定義時賦值
在構造器中可以修改常量屬性
用type? 聲明,默認值是nil
Swift使用ARC來跟蹤管理應用使用的內存。大部分情況下,意味著在swift中,內存管理仍然工作,不需要自己考慮內存管理的事情,當實例不再被使用是,ARC會自動釋放類實例所占的內存
解決類實例見的強引用環
弱引用 (使用weak聲明若引用)
無主引用 (使用unowned 聲明無主引用)
無主引用以及隱式展開的可選屬性 (隱式展開的可選屬性 type!)
閉包產生的強環形引用:將一個閉包賦值給類實例的某個屬性,并且這個閉包使用了實例。這個閉包可能訪問實例的某個屬性,例如self.someProperty,或者調用某個方法,例如:self.someMethod()。
解決閉包閉包產生的強環形引用,定義占有列表(用 [unowed/weak self] 聲明)
@lazy var property : (parametertype) -> returntype = {
[unowned self] (parameter: parametertype) -> returntype in
}
當閉包和占有的實例總是相互引用并且同時銷毀時,閉包占有定義為unowned。相反,當占有引用有時可能會說nil時,將閉包內的占有定義為weak。弱引用總是可選類型。
兩個屬性值都是可選類型都可能是nil時,使用弱引用
兩個屬性中只有一個是可選類型,并且可能nil時,使用無主引用
兩個屬性都必須有值就使用無主引用和隱式展開可選屬性。
聲明可選類型的強制拆包:var s = String? var t = s!
extension SomeType = {}
protocol SomeProtocol {}
能在方法或函數內部修改實例類型的方法稱為突變方法。mutating
原文地址:https://developer.apple.com/library/ios/documentation/swift/conceptual/swift_programming_language/index.html
譯文地址:http://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/
新聞熱點
疑難解答