Swift3入門(mén)教程之一基礎(chǔ)部分

我的博客地址: fengqiangboy.com

文檔更新說(shuō)明:

?   2016年10月07日 v1.0 初稿

0聚唐、前言

隨著iOS10的發(fā)布丐重,相信大部分公司都會(huì)把a(bǔ)pp的適配最低版本直接拉倒iOS8,畢竟維護(hù)和開(kāi)發(fā)成本都會(huì)省掉不少拱层。
在iOS8上面弥臼,有一個(gè)重要的特性,就是可以使用swift了根灯,而swift也已經(jīng)發(fā)布了3.0版本径缅,已經(jīng)相當(dāng)穩(wěn)定了,所以烙肺,這個(gè)時(shí)候開(kāi)始使用swift是一個(gè)明智的選擇纳猪。
這篇文章適合于有一定iOS開(kāi)發(fā)經(jīng)驗(yàn)的看。

1桃笙、常量

  • 常量是不需要被改變的氏堤,用let關(guān)鍵字聲明
  • 后面跟著常量的名稱,冒號(hào)后面表示產(chǎn)量的類型搏明,等號(hào)后面表示常量的值鼠锈。
  • 在實(shí)際應(yīng)用當(dāng)中,一般省略冒號(hào)后面的類型聲明星著,swift會(huì)自動(dòng)根據(jù)我們的賦值來(lái)推斷該常量的類型购笆。
let language: String = "Swift"
let introduced: Int = 2014
let isAwesome: Bool = true

2、變量

  • 可以被修改的值虚循,我們稱為變量
  • 在swift中同欠,變量使用var聲明,格式和常量的聲明一致横缔。
let language = "Swift"
let introduced = 2014
let isAwesome = true
var version = 1
version = 3
isAwesome = false  //這行報(bào)錯(cuò)

運(yùn)行上面的代碼铺遂,可以發(fā)現(xiàn),編譯器在最后一行報(bào)了錯(cuò)誤茎刚,因?yàn)槲覀冊(cè)噲D修改了一個(gè)常量的值襟锐。

3、字符串拼接

  • swift中直接使用“+”來(lái)拼接字符串即可
let conference = "WWDC"
let message = "Hello, " + conference + "!"
// "Hello, WWDC!"

4膛锭、字符串插值

  • 字符串的拼接不僅僅局限于字符串之間粮坞,swift也可以直接把值插入字符串中笛质。
  • 把值連接到字符串中,只需要把值放入\()中捞蚂,
  • 括號(hào)內(nèi)還可以是一個(gè)表達(dá)式。例如:\(year + 1)
let conference = "WWDC"
let message = "Hello, \(conference)!"
// "Hello, WWDC!"
let conference = "WWDC"
let year = 2016
let message = "Hello, \(conference) \(year)!"
// "Hello, WWDC 2016!"
let conference = "WWDC"
let year = 2016
let message = "Hello, \(conference) \(year + 1)!"
// "Hello, WWDC 2017!"

5跷究、集合:數(shù)組和字典

  • swift中姓迅,數(shù)組和字典的聲明方式很相似,
  • 為了安全俊马,我們可以在名字后面聲明類型丁存。
let names: [String] = ["Lily", "Santiago", "Justyn", "Aadya"]
let ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
  • 當(dāng)然,swift也可以自動(dòng)推測(cè)數(shù)組和字典的類型柴我,因此解寝,在實(shí)際應(yīng)用中,可以省略類型
let names = ["Lily", "Santiago", "Justyn", "Aadya"]
// an array of String values
let ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
// a dictionary with String keys and Int values

6艘儒、循環(huán)

6.1 While 和 Repeat-While 循環(huán)

  • while循環(huán)聋伦,先檢查條件是否成立,再執(zhí)行循環(huán)體
  • repeat循環(huán)界睁,先執(zhí)行循環(huán)體觉增,再判斷條件是否成立
while !endOfFile {
   readLine()
}


repeat {
   performTask()
} while tasksRemaining > 0

6.2 For-In循環(huán)

6.2.1 遍歷字符串

let dogString = "Dog?!??"
for character in dogString.characters {
   print(character)
}


/*
輸出結(jié)果:
D
o
g
?
!
??
*/

6.2.2 遍歷一個(gè)閉合區(qū)間

使用1...5表示[1,5]的閉合區(qū)間

for number in 1...5 {
   print("\(number) times 4 is \(number * 4)")
}

/*
輸出結(jié)果:
1 times 4 is 4
2 times 4 is 8
3 times 4 is 12
4 times 4 is 16
5 times 4 is 20
*/

6.2.3 遍歷半開(kāi)半閉合區(qū)間

  • 使用1..<5表示[1,5)的半開(kāi)半閉區(qū)間
  • 沒(méi)有這樣的寫(xiě)法1<..5
let results = [7, 52, 9, 33, 6, 12, 86, 4, 22, 18, 3]
let maxResultCount = 5
for index in 0..<maxResultCount {
   print("Result \(index) is \(results[index])")
}

/*
輸出結(jié)果:
Result 0 is 7
Result 1 is 52
Result 2 is 9
Result 3 is 33
Result 4 is 6
*/

6.2.4 遍歷數(shù)組

  • 遍歷的臨時(shí)變量不需要用let聲明,默認(rèn)以let聲明翻斟,如果需要逾礁,可以直接換成var聲明,如:for var name in [...]
  • 如果遍歷的臨時(shí)變量不需要被使用到访惜,可以用“_”來(lái)代替
for name in ["Lily", "Santiago", "Justyn", "Aadya"] {
   print("Hello, \(name)!")
}

/*
輸出結(jié)果:
Hello, Lily!
Hello, Santiago!
Hello, Justyn!
Hello, Aadya!
*/

6.2.5 遍歷字典

  • 使用元組(key, value)來(lái)表示字典的鍵和值
  • 元組是可以綁定多個(gè)值的一個(gè)類型嘹履,用括號(hào)表示,值之間用逗號(hào)分割開(kāi)來(lái)
let ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
for (name, age) in ages {
   print("\(name) is \(age) years old")
}

/*
輸出結(jié)果:
Mohsen is 17 years old
Amy is 40 years old
Graham is 5 years old
*/

7债热、可變集合

7.1砾嫉、可變數(shù)組

使用var聲明的數(shù)組就是可變數(shù)組,可以通過(guò)幾種方式修改可變數(shù)組中的值阳柔。

  • 使用.append方法焰枢,給數(shù)組添加一個(gè)元素
  • 使用下標(biāo)packingList[2]的方式,修改數(shù)組指定位置的元素(小心越界)
  • 使用.append(contentsOf:[])給數(shù)組增加一系列的值
  • 使用下標(biāo)packingList[3...5]修改數(shù)組指定位置范圍的值舌剂,使用這個(gè)方法的時(shí)候济锄,如果等號(hào)右邊的元素?cái)?shù)量大于左邊的范圍,會(huì)擴(kuò)充原數(shù)組的長(zhǎng)度霍转,反之會(huì)減少
var packingList = ["Socks", "Shoes"]
print(packingList[0])
packingList.append("Trousers")
packingList[2] = "Jeans"
packingList.append(contentsOf: ["Shorts", "Sandals", "Sunblock"])
packingList[3...5] = ["Hoodie", "Scarf"]


/*
輸出結(jié)果:

["Socks", "Shoes", "Jeans", "Hoodie", "Scarf"]

*/

7.2荐绝、可變字典

  • 可變字典的修改和增加方式都可以用下標(biāo)來(lái)直接操作
var ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
ages["Justyn"] = 67     // Adds a new value for "Justyn"
ages["Justyn"] = 68     // Changes the value for "Justyn"

/*
輸出結(jié)果:

["Mohsen": 17, "Amy": 40, "Graham": 5, "Justyn": 68]

*/

8、Optional

8.1避消、從字典中檢索值

  • 從字典中檢索值需要考慮一個(gè)問(wèn)題低滩,就是字典中可能并沒(méi)有存儲(chǔ)我們需要檢索的值召夹,比如,在下面的字典中恕沫,我們?nèi)绻カ@取Devon监憎、Daryl、Daniel的值婶溯,這時(shí)候會(huì)獲得一個(gè)空值nil
  • 在獲取之后鲸阔,我們需要判斷一下值是否為nil
let ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
// Devon?
// Daryl?
// Daniel?

8.2、加上nil判斷

  • 對(duì)于可能返回nil的值迄委,我們可以使用swift的Optional特性褐筛,在類型后面加一個(gè)?,比如:Int?叙身,這就表示這個(gè)值可能為nil
  • 從字典獲取指定的值渔扎,加上判斷之后就變成了下面的代碼
let ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
let possibleAge: Int? = ages["Daryl"]
if possibleAge == nil {
   print("Age not found.")
}


/*
輸出結(jié)果:

Age not found.

*/

8.3、nil值判斷優(yōu)化 If-Let

  • 上面的判斷看起來(lái)沒(méi)問(wèn)題信轿,但是在實(shí)際應(yīng)用中晃痴,我們可能只關(guān)心值不為nil的情況,所以财忽,上面的寫(xiě)法會(huì)有些臃腫
  • swift中提供了If-Let語(yǔ)句愧旦,只有在值不為nil的時(shí)候才執(zhí)行條件體
let ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
if let age = ages["Amy"] {
   print("An age of \(age) was found.")
}


/*
輸出結(jié)果:

An age of 40 was found.

*/

9、 判斷結(jié)構(gòu)

9.1定罢、if判斷結(jié)構(gòu)

  • 和其它語(yǔ)言相似笤虫,只是swift中,條件語(yǔ)句不需要小括號(hào)括號(hào)括起來(lái)祖凫。
  • 每個(gè)條件的執(zhí)行語(yǔ)句需要用大括號(hào)括起來(lái)
let age = 32
if age == 1 {
   print("Happy first birthday!")
} else if age == 40 {
   print("Happy 40th birthday!")
} else {
   print("Happy plain old boring birthday.")
}

9.2琼蚯、Switch 判斷結(jié)構(gòu)

  • case可以直接匹配一個(gè)精確的值,包括字符串變量也可以直接匹配
  • case也可以匹配一個(gè)范圍惠况。如:case 13...19:
  • case中還可以加入更精確的條件匹配語(yǔ)句遭庶。如:case let decade where decade % 10 == 0:
  • 每個(gè)case語(yǔ)句不需要break來(lái)結(jié)束循環(huán),會(huì)自動(dòng)結(jié)束稠屠,如果需要執(zhí)行下一個(gè)case的語(yǔ)句峦睡,需要加上fallthrough關(guān)鍵字
  • switch中需要匹配完整所有的情況,否則會(huì)報(bào)錯(cuò)
let age = 32
switch age {
case 1:
   print("Happy first birthday!")
case 13...19:
   print("Happy birthday, teenager!")
case let decade where decade % 10 == 0:
   print("Happy significant \(decade)th birthday!")
default:
   print("Happy plain old boring birthday.")
}
  • switch可以直接匹配元組权埠,以達(dá)到匹配同時(shí)判斷多個(gè)值的目的榨了,如下:
  • _” 表示該位置匹配任何值
let userName = "admin"
let passwordIsValid = true
switch (userName, passwordIsValid) {
case ("admin", true):
   print("Welcome back, administrator!")
case ("guest", _):
   print("Guests are not allowed in this restricted area.")
case (_, let isValid):
   print(isValid ? "Welcome to the restricted area!" : "ACCESS DENIED.")
}


/*
輸出結(jié)果:

Welcome back, administrator!

*/

相關(guān)文章

1、Swift3入門(mén)教程之二---函數(shù)

參考資料:

  1. Swift Standard Library Playground
  2. Swift.org
  3. The Swift Programming Language (Swift 3)
  4. Using Swift with Cocoa and Objective-C (Swift 3)
  5. WWDC2016:Session 404 Getting Started with Swift
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末攘蔽,一起剝皮案震驚了整個(gè)濱河市龙屉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌满俗,老刑警劉巖转捕,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件作岖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡五芝,警方通過(guò)查閱死者的電腦和手機(jī)痘儡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)枢步,“玉大人谤辜,你說(shuō)我怎么就攤上這事〖叟酰” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵涡戳,是天一觀的道長(zhǎng)结蟋。 經(jīng)常有香客問(wèn)我,道長(zhǎng)渔彰,這世上最難降的妖魔是什么嵌屎? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮恍涂,結(jié)果婚禮上宝惰,老公的妹妹穿的比我還像新娘。我一直安慰自己再沧,他們只是感情好尼夺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著炒瘸,像睡著了一般淤堵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上顷扩,一...
    開(kāi)封第一講書(shū)人閱讀 51,231評(píng)論 1 299
  • 那天拐邪,我揣著相機(jī)與錄音,去河邊找鬼隘截。 笑死扎阶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的婶芭。 我是一名探鬼主播东臀,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼犀农!你這毒婦竟也來(lái)了啡邑?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤井赌,失蹤者是張志新(化名)和其女友劉穎谤逼,沒(méi)想到半個(gè)月后贵扰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡流部,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年戚绕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枝冀。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舞丛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出果漾,到底是詐尸還是另有隱情球切,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布绒障,位于F島的核電站吨凑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏户辱。R本人自食惡果不足惜鸵钝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望庐镐。 院中可真熱鬧恩商,春花似錦、人聲如沸必逆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)名眉。三九已至研叫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間璧针,已是汗流浹背嚷炉。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留探橱,地道東北人申屹。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像隧膏,于是被迫代替她去往敵國(guó)和親哗讥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容