Swift一些基礎(chǔ)知識(shí)

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)記憶

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末乍赫,一起剝皮案震驚了整個(gè)濱河市兔综,隨后出現(xiàn)的幾起案子锭沟,更是在濱河造成了極大的恐慌释簿,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓶逃,死亡現(xiàn)場離奇詭異箩朴,居然都是意外死亡芹缔,警方通過查閱死者的電腦和手機(jī)养匈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來都伪,“玉大人呕乎,你說我怎么就攤上這事≡删В” “怎么了猬仁?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長先誉。 經(jīng)常有香客問我湿刽,道長,這世上最難降的妖魔是什么褐耳? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任诈闺,我火速辦了婚禮,結(jié)果婚禮上铃芦,老公的妹妹穿的比我還像新娘雅镊。我一直安慰自己,他們只是感情好刃滓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布仁烹。 她就那樣靜靜地躺著,像睡著了一般咧虎。 火紅的嫁衣襯著肌膚如雪卓缰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音征唬,去河邊找鬼捌显。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鳍鸵,可吹牛的內(nèi)容都是我干的苇瓣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼偿乖,長吁一口氣:“原來是場噩夢啊……” “哼击罪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贪薪,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤媳禁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后画切,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竣稽,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年霍弹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了毫别。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡典格,死狀恐怖岛宦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情耍缴,我是刑警寧澤砾肺,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站防嗡,受9級(jí)特大地震影響变汪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蚁趁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一裙盾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荣德,春花似錦闷煤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至署咽,卻和暖如春近顷,著一層夾襖步出監(jiān)牢的瞬間生音,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國打工窒升, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缀遍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓饱须,卻偏偏與公主長得像域醇,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蓉媳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354