在 swift 中使用var
和let
分別宣告變數和常量,至於型別,則可以通過後面的初始值資訊進行推斷,或者直接在變數名後進行指定。
var str = "string"
let num: int = 0
var isopen: bool
這種不同於 oc 的宣告書寫格式,是否會覺得有點不習慣呢,但是鑑於其自動推斷型別的強大功能,通常我們是可以省略型別說明的,書寫起來會更加便捷。
使用反引號可以將關鍵字指定為變數名稱,但是不提倡這樣做。
let `var` = "var"
print(`var`)
在 swift 中值的型別轉換必須是顯示的,如下面將字串轉換為整型:
let str = "2"
let num = 3
let result = int(str)! + num
如果int(str)
強制轉換失敗,那麼可選值結果為nil
,此時進行強制解包則會報錯。
陣列和字典的宣告更佳便捷,同樣可以省略型別說明。
let array = [string]()
let dic = [string:int]()
let array = ["str1","str2"]
let dic = ["1":1,"2":2]
陣列和字典的宣告如此相似,是否可以將字典看作是元素是鍵值對的無序陣列呢,並且元素的型別可以是諸如int
的基本型別,相對於 oc 是不是幫了大忙了!
在 swift 中不再支援 c 語言中的for
語句迴圈,如列印 0 到 9 ,使用如下寫法是無法編譯通過的:
for(int i = 0;i<10;i++)
但是這裡引入了範圍表示式:..<
和...
,分別表示不包括上界限和包括上界限的範圍,所以有如下寫法:
for i in 0..<10
另外,do-while
迴圈則修改為了repeat-while
迴圈,當然,while
迴圈還可以使用。
for-in
迴圈進行了強化,臨時變數無需宣告型別且可以是元組型別。
for (key,value) in ["2":2]
對於條件語句而言,判斷條件必須是布林表示式,不會在隱式的將數值同 0 進行比較或判斷可選型別是否為 nil ,並且包裹判斷條件的圓括號可以省略。
let num = 3
if num > 0
不過,對於可選型別,這裡提供了一種書寫方式,將判斷其是否是 nil ,然後再去進行解包合為一步,也稱為可選繫結。
let str: string? = "5"
if let temp = str,let num = int(temp),num == 5 else if let num = int("5")
如果可選值有值,則將值賦給臨時變數,而後執行下面的語句,如果為 nil ,那麼則跳過下面的語句。
需要注意的是,這種寫法必須要省略圓括號。
在 swift 中使用switch
選擇分支時,如果將所有的情況都列出了,則可以省略default
選項。如果無法列出所有的可能項,則需要使用default
預設項。
let str = "test str"
switch str
switch 中可以比較的值不在限於整型值,其他型別也可以,而且還可以使用where
關鍵字來新增限定條件。
使用struct
關鍵字定義結構體,其和類一樣,可以宣告變數、方法和構造器,但是其同類有個重要區別,就是類例項傳遞時,傳遞的是引用,而結構體傳遞的是值。
protocol named
}protocol aged
}struct person: named, aged
結構體可以遵循協議,但是不能繼承結構體。
使用enum
關鍵字定義列舉型別,除了使用case
定義列舉值外,還可以定義方法,但是不能定義儲存屬性。而且,列舉值除了其原始值外,還可以有不同的關聯值,相同原始值的列舉例項變數如果關聯值不同,那麼這兩個列舉變數是不相等的。
enum enumtest
}}let enumt1 = enumtest.tt1(str: "str1", num: nsnumber.init(value: 1))
enumt1.test()
如果需要通過:
指定列舉的原始值,那麼該原始值型別需要遵循rawrepresentable
協議。列舉同樣不能繼承列舉,但同樣可以遵循協議。
使用protocol
關鍵字來定義協議,類、列舉、結構體都可以遵循協議,並且如果協議會被結構體實現,且其中定義的函式需要修改結構體中的屬性,那麼需要使用mutating
關鍵字來修飾該函式,來表明這是乙個可以修改結構體屬性的函式,而類函式本身就可以修改屬性,則不需要額外標記。
可以使用extension
關鍵字來擴充套件某個型別,宣告其遵循某個協議。
類如果繼承其他類,那麼其遵循的協議要寫在繼承的類之後。
宣告函式時,可以指定引數型別為遵循某一協議的任意型別,遵循多個協議的型別使用&
進行連線。
func test(para: named&aged)
閉包是自包含的函式**塊,可以在**中被傳遞和使用,全域性函式和巢狀函式實際上是特殊的閉包。
使用@escaping
來宣告乙個閉包是逃逸閉包,即作為引數傳遞給函式的閉包,可以在該函式執行結束之後進行呼叫,常用於非同步操作。在逃逸閉包中,是不可以隱式引用self
的,必須顯示地引用。
var completionhandlers: [() -> void] =
func somefunctionwithescapingclosure(completionhandler: @escaping () -> void)
somefunctionwithescapingclosure
completionhandlers[0]()
自動閉包不接受引數,但是可以有返回值。如果乙個函式的引數是乙個閉包,那麼使用@autoclosure
進行修飾後,呼叫該函式時,其必須接收乙個非閉包引數並自動將其轉換為閉包。
var customersinline = ["chris", "alex", "ewa", "barry", "daniella"]
func serve(customer customerprovider: @autoclosure () -> string)
serve(customer: customersinline.remove(at: 0))
並且此時,如果傳遞閉包引數serve(customer: )
是會報錯的。
在 swift 中可以使用泛型來表示函式的引數為任意型別,而且需要使用inout
修飾引數,來表示引數是可以被修改的。
public func swap(_ a: inout t, _ b: inout t)
函式、方法、類、列舉、結構體都可以使用泛型。使用泛型時,還可以限定其必須是某個類的子類或必須實現某個協議,還可以使用where
子句來新增額外的約束條件。
func allitemsmatch(_ somecontainer: c1, _ anothercontainer: c2) -> bool
where c1.itemtype == c2.itemtype, c1.itemtype: equatable
protocol container
subscript(_ index:int)->itemtype
}
對於allitemsmatch
函式而言,其接收的兩個引數必須都遵循了container
協議,而且關聯的型別itemtype
必須遵循equatable
協議。
在定義類的例項變數或方法時,可以使用關鍵字static
或class
,但是在協議、結構體或擴充套件中,只能使用static
關鍵字。如此,當類遵循的某個協議中使用static
定義了乙個變數,那麼該類在實現該協議時,使用static
或class
宣告該變數都可以。
在 swift 中,使用typealias
關鍵字取代typedef
關鍵字,定義型別別名。
typealias int_16 = int16
swift小結02 基礎篇
閉包 類似於 oc 中的 block,是一段預先定義好的 在需要時執行 閉包表示式格式 in用於區分閉包定義和 實現 定義有引數a的閉包 let coluse 定義無引數的閉包 let coluse1 let coluse2 尾隨閉包 當閉包是最後乙個引數的時候,將閉包放在引數整個 外面 uivie...
swift 學習筆記一《基礎》
資料型別 檢視原始碼可知都是結構體 int 整形數 uint 正整形數 float 單精度 double 雙精度 string 字串 swift特有型別 元組 可以任意放兩個資料在裡面,例如 let locatoin 1,3 optional 可選型別,也是個結構體,通常用於資料可能為空的情況,例如...
基礎面試小結(一)
1 乙個大div包2個小div,其中乙個div寬高固定另乙個div自適應 第一種方法 使用css3屬性 left right第二種方法 使用flex布局 box left right第三種方法 margin left rightget 步驟一 建立非同步物件 步驟二 設定請求的url引數,引數一是請...