Swift擁有所有基本C和Objective-C類型
Int整型
Double & Float浮點(diǎn)型
Bool布爾值
String文本數(shù)據(jù)
Swift還擁有三種集合主要類型: Array, Set & Dictionary
Swift引入了Optional<T>(可選類型) .
在編程中不可避免的,函數(shù)不總是返回我們期望的值.
Objective-C中我們可以使用類似哨兵值的方法解決(然而也并不能完全解決)
例如
NSString * tmp = nil;
if ([tmp rangeOfString: @"Swift"].location != NSNotFound) {
NSLog(@"Something about Swift");//Will execution the code and print.
}
在Objective-C中執(zhí)行這段代碼,將會(huì)在控制臺(tái)得到 Something about
而在Swift中,則使用Optional替代了哨兵值的方法.
它讓編輯器會(huì)強(qiáng)制我們處理可能發(fā)生錯(cuò)誤的情況.可以通過包含兩個(gè)case的enum模擬它得知:
case some(T)表示成功的情況
case none表示失敗的情況
例如:
let array = [1, 2]
let index = array.first(它返回的其實(shí)是一個(gè)Optional<Int>)
如果我們要使用index,則只能用下面的方法:
switch index {
case let .some(index):
print("First value of array is \(index)")
case .none:
print("Not Value")
}
Swift對(duì)Switch中使用Optional的時(shí)候還有簡化版:
switch index {
case let index?:
print("First value of array is \(index)")
case nil:
print("Not Value")
}
(在Swift中的nil與Objective-C中的nil并不一樣,在Objective-C中,nil是指向不存在對(duì)象的指針.而在Swift中, nil不是指針,而是缺少某種類型的值,我們可以將任何類型的Optional賦值為nil,而不僅是對(duì)象類型)
當(dāng)然以上只是Optional的實(shí)現(xiàn)細(xì)節(jié),對(duì)于我們的使用并不用如此麻煩
我們?cè)谑褂肙ptional時(shí),有諸多簡化的寫法
例如最簡單的:
let name: String? = "programmer??"
如果我們要使用它的值.可以通過最暴力的辦法,即通過(!)強(qiáng)行讀取Optional的值,在Swift中叫做force unwrapping:
print(name!)
我們已經(jīng)見過很多相關(guān)的討論,例如
"永遠(yuǎn)不要使用force unwrapping"
"除非不得已,才使用它"
:
在絕對(duì)安全的情況下使用force unwrapping
if name != nil {
print(name!)
}
or
let numbers: [Int?] = [1, nil, 3]
numbers
.filter { $0 != nil }
.map { print($0!) }
通過unwrapped使用Optional
在條件分支中使用 (if let)
if let name = name {
print(name)
}
更復(fù)雜的用法
var image: UIImage?
//something..
if let image = image,
let imageData = image. jpegData(compressionQuality: 0.9),
imageData.count <= (10 * 1024 * 1024) {
//upload data...
}
or 在循環(huán)中使用 (while let)
let cars = ["Lincoln", "Lamborghini", "Audi"]
var carIterator = cars.makeIterator() // 不能使用let,否則會(huì)在編譯時(shí)報(bào)錯(cuò)
while let carName = cars.next() {
print(carName)
}
(然而在這里也有個(gè)知識(shí)點(diǎn).
在Swift中, for…in 是通過while模擬出來的,
for循環(huán)中的循環(huán)變量在每次迭代時(shí),
都是一個(gè)全新的對(duì)象,
而不是對(duì)上一個(gè)循環(huán)遍歷的修改,
為什么要這樣做,
因?yàn)樵贘avaScript中有一種有違直覺的BUG…具體等以后開坑再放鏈接..)
or 通過guard替代if let,使作用域擴(kuò)大
func getName() -> String? {
let name: String? = "programmer??"
guard let name = name else {
return nil
}
return name
}
還有一種特殊的Optional: 隱式展開的可選值(Implicitly Unwrapped Optional)
它主要在以下兩個(gè)場景中使用:
1.傳承Objective-C中對(duì)象指針的語義
2.用來定義初始為nil,但在經(jīng)過既定流程后,再也不為nil的變量
例如
func ChooseTransportation(_ ownedMoney: Double) {
let transportation: String!
if (ownedMoney > 100 * 10000) {
transportation = "??"
} else {
transportation = "??"
}
//upload transportation name
}
總得來說,建議還是使用其他辦法,來避免直接使用(!)去讀取Optional的值
Swift常量變量
Swift使用let聲明常量,var聲明變量.
且它們必須在使用前聲明值,命名規(guī)則幾乎可以包含任何字符(但不能以數(shù)字開頭!!,不能包含空格字符,數(shù)字符號(hào),箭頭和專用的字符)
打印常量或變量:
print(name) | print("The current Value of name is \(name) ")
Swift類型注釋
聲明常量or變量時(shí),可以提供類型注釋,來明確存儲(chǔ)值類型.
寫法:
var name: String = "programmer??"
聲明類型的同時(shí)必須指定初始值或者給與設(shè)為可選類型( Optional<String>? | String? or '!' ),不然編譯器會(huì)產(chǎn)生錯(cuò)誤提示:
"Property 'self.name' not initialized at super.init call"
Swift注釋
單行注釋:
// a comment.
多行注釋:
/*
a comment.
but is written over multiple lines.
*/
多行嵌套注釋:(與C不同)
/* start.
/* nested multiline comment. */
end. */
Swift分號(hào);
在Swift中我們并不需要用到分號(hào)(;),當(dāng)然我們可以按喜好添加
不過在一行中包含多個(gè)單獨(dú)代碼語句,則需要分號(hào):
let name = "programmer??"; print(name)
Swift類型安全性和推斷
Swift是類型安全的語言,它會(huì)在編譯代碼時(shí)執(zhí)行類型檢查,并產(chǎn)生錯(cuò)誤信息.例如無法將Int值傳遞給String變量.
Swift的類型推斷,與Objective-C or C之類的語言相比, 所需的類型聲明要少得多.
let carPrice = 199999.99 //Swift會(huì)推斷出這是創(chuàng)建了一個(gè)Double(推斷浮點(diǎn)型時(shí),它總會(huì)選擇Double而不是Float)
Swift布爾值
Swift的布爾類型Bool,亦被稱為邏輯值.它只能是true或false,所以并不能像Objective-C一樣, 使用
if 1 { /* something.. */ } // 這樣做會(huì)造成編譯時(shí)錯(cuò)誤.
Swift元組
Swift的元組是在Obective-C中找不到的高級(jí)類型之一,它可以創(chuàng)建和傳遞值分組,
元組將多個(gè)值合并為一個(gè)復(fù)合值,且其中的值可以是任何類型,不必彼此相同.
它適用于一組簡單的值,如果需要復(fù)雜的數(shù)據(jù)結(jié)構(gòu),建議使用Class or Struct
例如:
(Int, Int, Int) | (String, Double, Bool)
寫法:
let result = (404, "Not Found")
//result is of type (Int, String)
還可以將其分解為單獨(dú)的常量或變量,然后直接訪問他們
let (statusCode, statusMessage) = result
print("statusCode is \(statusCode) and statusMessage is \(statusMessage)")
或使用下劃線( _ )忽略某個(gè)不需要用到的值
let (statusCode, _) = result
或直接在初始化時(shí)命名
let result = (statusCode: 404, statusMessage: "Not Found")
print("statusCode is \(result.statusCode) and statusMessage is \(result.statusMessage)")
或取消命名直接通過(.)使用
print("statusCode is \(result.0) and statusMessage is \(result.1)")
備注:
以上資料僅僅是通過查閱官方文檔 & 泊學(xué)網(wǎng)學(xué)習(xí)并手動(dòng)記錄之,以增強(qiáng)記憶