一.基本語法
引入swift和oc一樣也是使用import + 庫名 不需要雙引號(hào),例如:
import Cocoa
注釋swift和oc一樣 有單行//? 多行/* */? 還有嵌套/*? /* */? */
分號(hào)swift不要求在每行語句的結(jié)尾使用分號(hào)(;),但當(dāng)你在同一行書寫多條語句時(shí),必須用分號(hào)隔開:
標(biāo)識(shí)符就是給變量腰鬼、常量、方法额各、函數(shù)、枚舉吧恃、結(jié)構(gòu)體虾啦、類、協(xié)議等指定的名字
Swift語言中標(biāo)識(shí)符的命名規(guī)則如下:
?區(qū)分大小寫痕寓,Myname與myname是兩個(gè)不同的標(biāo)識(shí)符傲醉;
?標(biāo)識(shí)符首字符可以以下劃線(_)或者字母開始,但不能是數(shù)字呻率;
?標(biāo)識(shí)符中其他字符可以是下劃線(_)硬毕、字母或數(shù)字
如果一定要使用關(guān)鍵字作為標(biāo)識(shí)符,可以在關(guān)鍵字前后添加重音符號(hào)(`)礼仗,例如:
?let `class` = "Runoob"
在Swift中吐咳,運(yùn)算符不能直接跟在變量或常量的后面。例如下面的代碼會(huì)報(bào)錯(cuò):
let a= 1 + 2
二.數(shù)據(jù)類型 (和oc差不多)
Int
UInt
浮點(diǎn)數(shù):Float元践、Double
布爾值:Bool
Swift 有兩個(gè)布爾常量韭脊,true 和 false。
字符串:String
字符串是字符的序列集合单旁,例如:"Hello, World!"
字符:Character
字符指的是單個(gè)字母沪羔,例如:"C"
可選類型:Optional
使用可選類型來處理值可能缺失的情況∠蠡耄可選類型表示有值或沒有值蔫饰。
類型別名
類型別名對(duì)當(dāng)前的類型定義了另一個(gè)名字,類型別名通過使用 typealias 關(guān)鍵字來定義愉豺。語法格式如下:
typealias newname = type
例如以下定義了 Int 的類型別名為 Feet:
typealias Feet = Int
可以通過別名來定義變量:
import Cocoa
typealias Feet = Int
var distance: Feet = 100
print(distance)
輸出結(jié)果為:100
類型安全
Swift 是一個(gè)類型安全(type safe)的語言,它會(huì)在編譯你的代碼時(shí)進(jìn)行類型檢查(type checks)篓吁,并把不匹配的類型標(biāo)記為錯(cuò)誤。這可以讓你在開發(fā)的時(shí)候盡早發(fā)現(xiàn)并修復(fù)錯(cuò)誤蚪拦。
import Cocoa
var varA = 42
varA = "This is hello"
print(varA)
以上程序杖剪,會(huì)在 Xcode 中報(bào)錯(cuò):
error: cannot assign value of type 'String' to type 'Int'
varA = "This is hello"
意思為不能將 'String' 字符串賦值給 'Int' 變量节腐。
類型推斷
當(dāng)你要處理不同類型的值時(shí),類型檢查可以幫你避免錯(cuò)誤摘盆。然而,這并不是說你每次聲明常量和變量的時(shí)候都需要顯式指定類型饱苟。
如果你沒有顯式指定類型孩擂,Swift 會(huì)使用類型推斷(type inference)來選擇合適的類型。
例如箱熬,如果你給一個(gè)新常量賦值42并且沒有標(biāo)明類型类垦,Swift 可以推斷出常量類型是Int,因?yàn)槟憬o它賦的初始值看起來像一個(gè)整數(shù):
let meaningOfLife = 42
// meaningOfLife 會(huì)被推測為 Int 類型
同理城须,如果你沒有給浮點(diǎn)字面量標(biāo)明類型蚤认,Swift 會(huì)推斷你想要的是Double:
let pi = 3.14159
// pi 會(huì)被推測為 Double 類型
當(dāng)推斷浮點(diǎn)數(shù)的類型時(shí),Swift 總是會(huì)選擇Double而不是Float糕伐。如果表達(dá)式中同時(shí)出現(xiàn)了整數(shù)和浮點(diǎn)數(shù)砰琢,會(huì)被推斷為Double類型:
let anotherPi = 3 + 0.14159
// anotherPi 會(huì)被推測為 Double 類型
原始值3沒有顯式聲明類型,而表達(dá)式中出現(xiàn)了一個(gè)浮點(diǎn)字面量良瞧,所以表達(dá)式會(huì)被推斷為Double類型陪汽。
實(shí)例
import Cocoa
// varA 會(huì)被推測為 Int 類型
var varA = 42
print(varA)
// varB 會(huì)被推測為 Double 類型
var varB = 3.14159
print(varB)
// varC 也會(huì)被推測為 Double 類型
var varC = 3 + 0.14159
print(varC)
執(zhí)行以上代碼,輸出結(jié)果為:
42
3.14159
3.14159
三.變量
變量聲明使用 var 關(guān)鍵字聲明它褥蚯,如下所示:
var variableName = <initial value>
以下是一個(gè) Swift 程序中變量聲明的簡單實(shí)例:
import Cocoa
var varA = 42
print(varA)
var varB:Float
varB = 3.14159
print(varB)
以上程序執(zhí)行結(jié)果為:
42
3.14159
變量命名變量名可以由字母挚冤,數(shù)字和下劃線組成。變量名需要以字母或下劃線開始赞庶。注意:Swift 是一個(gè)區(qū)分大小寫的語言训挡,所以字母大寫與小寫是不一樣的。變量名也可以使用簡單的 Unicode 字符(中文)
變量輸出變量和常量可以使用 print函數(shù)來輸出歧强。在字符串中可以使用括號(hào)與反斜線來插入變量澜薄,如下實(shí)例:
import Cocoa
var name = "你好"
var site = "夏天"
print("\(name)現(xiàn)在是:\(site)")
以上程序執(zhí)行結(jié)果為:
你好現(xiàn)在是:夏天
四.常量
常量一旦設(shè)定,在程序運(yùn)行時(shí)就無法改變其值誊锭。
常量可以是任何的數(shù)據(jù)類型如:整型常量表悬,浮點(diǎn)型常量,字符常量或字符串常量丧靡。同樣也有枚舉類型的常量:
常量類似于變量蟆沫,區(qū)別在于常量的值一旦設(shè)定就不能改變,而變量的值可以隨意更改温治。
常量聲明
常量使用關(guān)鍵字 let 來聲明饭庞,語法如下:
let constantName = <initial value>
實(shí)例:
import Cocoa
let constA = 42
print(constA)
以上程序執(zhí)行結(jié)果為:
42
類型標(biāo)注
當(dāng)你聲明常量或者變量的時(shí)候可以加上類型標(biāo)注(type annotation),說明常量或者變量中要存儲(chǔ)的值的類型熬荆。如果要添加類型標(biāo)注舟山,需要在常量或者變量名后面加上一個(gè)冒號(hào)和空格,然后加上類型名稱。
var constantName:<data type> = <optional initial value>
以下是一個(gè)簡單是實(shí)例演示了 Swift 中常量使用類型標(biāo)注累盗。需要注意的是常量定義時(shí)必須初始值:
import Cocoa
let constA = 42
print(constA)
let constB:Float = 3.14159
print(constB)
以上程序執(zhí)行結(jié)果為:
42
3.14159
五.可選(Optionals)類型
可選(Optional)類型寒矿,用于處理值缺失的情況∪粽可選表示"那兒有一個(gè)值符相,并且它等于 x "或者"那兒沒有值"。
Swfit語言定義后綴蠢琳?作為命名類型Optional的簡寫啊终,換句話說,以下兩種聲明是相等的:
var optionalInteger: Int?
var optionalInteger: Optional<Int>
在這兩種情況下傲须,變量 optionalInteger 都是可選整數(shù)類型蓝牲。注意,在類型和 ?之間沒有空格泰讽。
Optional 是一個(gè)含有兩種情況的枚舉例衍,None 和 Some(T),用來表示可能有或可能沒有值已卸。任何類型都可以明確聲明為(或者隱式轉(zhuǎn)換)可選類型肄渗。
當(dāng)聲明一個(gè)可選類型的時(shí)候,要確保用括號(hào)給 ? 操作符一個(gè)合適的范圍咬最。例如翎嫡,聲明可選整數(shù)數(shù)組,應(yīng)該寫成 (Int[])? 寫成 Int[]? 會(huì)報(bào)錯(cuò)永乌。
當(dāng)你聲明一個(gè)可選變量或者可選屬性的時(shí)候沒有提供初始值惑申,它的值會(huì)默認(rèn)為 nil。
可選項(xiàng)遵照 LogicValue 協(xié)議翅雏,因此可以出現(xiàn)在布爾環(huán)境中圈驼。在這種情況下,如果可選類型T?包含類型為T的任何值(也就是說它的值是 Optional.Some(T) )望几,這個(gè)可選類型等于 true绩脆,反之為 false。
如果一個(gè)可選類型的實(shí)例包含一個(gè)值橄抹,你可以用后綴操作符 靴迫!來訪問這個(gè)值,如下所示:
optionalInteger = 42
optionalInteger! // 42
使用操作符楼誓!去獲取值為nil的可選變量會(huì)有運(yùn)行時(shí)錯(cuò)誤玉锌。
你可以用可選鏈接和可選綁定選擇性執(zhí)行可選表達(dá)式上的操作。如果值為nil疟羹,任何操作都不會(huì)執(zhí)行主守,也不會(huì)有運(yùn)行報(bào)錯(cuò)禀倔。
讓我們來詳細(xì)看下以下實(shí)例來了解 Swift 中可選類型的應(yīng)用:
import Cocoa
var myString:String? = nil
if myString != nil {
? ? print(myString)
}else{
? ? print("字符串為 nil")
}
以上程序執(zhí)行結(jié)果為:
字符串為 nil
可選類型類似于Objective-C中指針的nil值,但是nil只對(duì)類(class)有用参淫,而可選類型對(duì)所有的類型都可用救湖,并且更安全。
強(qiáng)制解析
當(dāng)你確定可選類型確實(shí)包含值之后涎才,你可以在可選的名字后面加一個(gè)感嘆號(hào)(!)來獲取值捎谨。這個(gè)感嘆號(hào)表示"我知道這個(gè)可選有值,請使用它憔维。"這被稱為可選值的強(qiáng)制解析(forced unwrapping)。
實(shí)例如下:
import Cocoa
var myString:String?
myString = "Hello, Swift!"
if myString != nil {
? ? print(myString)
}else{
? ? print("myString 值為 nil")
}
以上程序執(zhí)行結(jié)果為:
Optional("Hello, Swift!")
強(qiáng)制解析可選值畏邢,使用感嘆號(hào)(!):
import Cocoa
var myString:String?
myString = "Hello, Swift!"
if myString != nil {
? ? // 強(qiáng)制解析
? ? print( myString! )
}else{
? ? print("myString 值為 nil")
}
以上程序執(zhí)行結(jié)果為:
Hello, Swift!
注意:
使用!來獲取一個(gè)不存在的可選值會(huì)導(dǎo)致運(yùn)行時(shí)錯(cuò)誤业扒。使用!來強(qiáng)制解析值之前,一定要確定可選包含一個(gè)非nil的值舒萎。
自動(dòng)解析
你可以在聲明可選變量時(shí)使用感嘆號(hào)(!)替換問號(hào)(?)程储。這樣可選變量在使用時(shí)就不需要再加一個(gè)感嘆號(hào)(!)來獲取值,它會(huì)自動(dòng)解析臂寝。
實(shí)例如下:
import Cocoa
var myString:String!
myString = "Hello, Swift!"
if myString != nil {
? ? print(myString)
}else{
? ? print("myString 值為 nil")
}
以上程序執(zhí)行結(jié)果為:
Hello, Swift!
可選綁定
使用可選綁定(optional binding)來判斷可選類型是否包含值章鲤,如果包含就把值賦給一個(gè)臨時(shí)常量或者變量∨乇幔可選綁定可以用在if和while語句中來對(duì)可選類型的值進(jìn)行判斷并把值賦給一個(gè)常量或者變量败徊。
像下面這樣在if語句中寫一個(gè)可選綁定:
if let constantName = someOptional {
? ? statements
}
讓我們來看下一個(gè)簡單的可選綁定實(shí)例:
import Cocoa
var myString:String?
myString = "Hello, Swift!"
if let yourString = myString {
? ? print("你的字符串值為 - \(yourString)")
}else{
? ? print("你的字符串沒有值")
}
以上程序執(zhí)行結(jié)果為:
你的字符串值為 - Hello, Swift!
六.字面量
所謂字面量,就是指像特定的數(shù)字掏缎,字符串或者是布爾值這樣皱蹦,能夠直接了當(dāng)?shù)刂赋鲎约旱念愋筒樽兞窟M(jìn)行賦值的值。比如在下面:
let aNumber = 3 ? ? ? ? //整型字面量
let aString = "Hello" ? //字符串字面量
let aBool = true? ? ? ? //布爾值字面量
整型字面量? 可以是一個(gè)十進(jìn)制眷蜈,二進(jìn)制沪哺,八進(jìn)制或十六進(jìn)制常量。 二進(jìn)制前綴為 0b酌儒,八進(jìn)制前綴為 0o辜妓,十六進(jìn)制前綴為 0x,十進(jìn)制沒有前綴:
以下為一些整型字面量的實(shí)例:
let decimalInteger = 17 ? ? ? ? ? // 17 - 十進(jìn)制表示
let binaryInteger = 0b10001 ? ? ? // 17 - 二進(jìn)制表示
let octalInteger = 0o21 ? ? ? ? ? // 17 - 八進(jìn)制表示
let hexadecimalInteger = 0x11 ? ? // 17 - 十六進(jìn)制表示
浮點(diǎn)型字面量有整數(shù)部分忌怎,小數(shù)點(diǎn)籍滴,小數(shù)部分及指數(shù)部分。
除非特別指定榴啸,浮點(diǎn)型字面量的默認(rèn)推導(dǎo)類型為 Swift 標(biāo)準(zhǔn)庫類型中的 Double异逐,表示64位浮點(diǎn)數(shù)。
以下為一些浮點(diǎn)型字面量的實(shí)例:
let decimalDouble = 12.1875 ? ? ? //十進(jìn)制浮點(diǎn)型字面量
let exponentDouble = 1.21875e1? ? //十進(jìn)制浮點(diǎn)型字面量
字符串型字面量由被包在雙引號(hào)中的一串字符組成插掂,形式如下:
"characters"
字符串型字面量中不能包含未轉(zhuǎn)義的雙引號(hào) (")灰瞻、未轉(zhuǎn)義的反斜線(\)腥例、回車符或換行符。
轉(zhuǎn)義字符? ? 含義
\0? ? 空字符
\\? ? 反斜線 \
\b? ? 退格(BS) 酝润,將當(dāng)前位置移到前一列
\f? ? 換頁(FF)燎竖,將當(dāng)前位置移到下頁開頭
\n? ? 換行符
\r? ? 回車符
\t? ? 水平制表符
\v? ? 垂直制表符
\'? ? 單引號(hào)
\"? ? 雙引號(hào)
\000? ? 1到3位八進(jìn)制數(shù)所代表的任意字符
\xhh...? ? 1到2位十六進(jìn)制所代表的任意字符
布爾型字面量的默認(rèn)類型是 Bool。
布爾值字面量有三個(gè)值要销,它們是 Swift 的保留關(guān)鍵字:
true 表示真构回。
false 表示假。
nil 表示沒有值疏咐。
七.運(yùn)算符
Swift 提供了以下幾種運(yùn)算符:
算術(shù)運(yùn)算符? ? ? + - * / %
比較運(yùn)算符? ? ? ==? !=? >? <? >=? <=
邏輯運(yùn)算符? ? ? &&? ? ||? !
位運(yùn)算符~,&,|,^分別為取反纤掸,按位與與,按位與或浑塞,按位與異或運(yùn)算
賦值運(yùn)算符? ? ? =? +=? -=? *= /=? %=? <<=? >>=? &=? ^=? |=
區(qū)間運(yùn)算符
閉區(qū)間? ? ? ? 實(shí)例:? 1...5 區(qū)間值為 1, 2, 3, 4 和 5
半開區(qū)間? ? 實(shí)例:? 1..< 5 區(qū)間值為 1, 2, 3, 和 4
其他運(yùn)算符?
? ? ? ? ? ? ? ? ? ? ? 一元減(數(shù)字前添加 - 號(hào)前綴)?
? ? ? ? ? ? ? ? ? ? ? 一元加(數(shù)字前添加 + 號(hào)前綴)?
? ? ? ? ? ? ? ? ? ? ? 三元運(yùn)算符 (condition ? X : Y)
八.條件語句 (和oc相同)
? if 語句
? if...else語句
? if...else if ...else語句
? 內(nèi)嵌if語句
? switch語句
九.循環(huán)語句(和oc相同)
? for-in
for 循環(huán)該循環(huán)方式在 Swift 3 中已經(jīng)棄用借跪。
? while 循環(huán)
? repeat...while循環(huán)
? switch語句
十.字符串
Swift 字符串是一系列字符的集合。例如 "Hello, World!" 這樣的有序的字符類型的值的集合酌壕,它的數(shù)據(jù)類型為 String掏愁。
創(chuàng)建字符串
你可以通過使用字符串字面量或 String 類的實(shí)例來創(chuàng)建一個(gè)字符串:
import Cocoa
// 使用字符串字面量
var stringA = "Hello, World!"
print( stringA )
// String 實(shí)例化
var stringB = String("Hello, World!")
print( stringB )
以上程序執(zhí)行輸出結(jié)果為:
Hello, World!
Hello, World!
空字符串
你可以使用空的字符串字面量賦值給變量或初始化一個(gè)String類的實(shí)例來初始值一個(gè)空的字符串。 我們可以使用字符串屬性 isEmpty 來判斷字符串是否為空:
import Cocoa
// 使用字符串字面量創(chuàng)建空字符串
var stringA = ""
if stringA.isEmpty {
? ? print( "stringA 是空的" )
} else {
? ? print( "stringA 不是空的" )
}
// 實(shí)例化 String 類來創(chuàng)建空字符串
let stringB = String()
if stringB.isEmpty {
? ? print( "stringB 是空的" )
} else {
? ? print( "stringB 不是空的" )
}
以上程序執(zhí)行輸出結(jié)果為:
stringA 是空的
stringB 是空的
字符串常量
你可以將一個(gè)字符串賦值給一個(gè)變量或常量卵牍,變量是可修改的果港,常量是不可修改的。
import Cocoa
// stringA 可被修改
var stringA = "菜鳥教程:"
stringA += "http://www.runoob.com"
print( stringA )
// stringB 不能修改
let stringB = String("菜鳥教程:")
stringB += "http://www.runoob.com"
print( stringB )
以上程序執(zhí)行輸出結(jié)果會(huì)報(bào)錯(cuò)糊昙,因?yàn)?stringB 為常量是不能被修改的:
error: left side of mutating operator isn't mutable: 'stringB' is a 'let' constant
stringB += "http://www.runoob.com"
字符串中插入值
字符串插值是一種構(gòu)建新字符串的方式辛掠,可以在其中包含常量、變量释牺、字面量和表達(dá)式公浪。 您插入的字符串字面量的每一項(xiàng)都在以反斜線為前綴的圓括號(hào)中:
import Cocoa
var varA ? = 20
let constA = 100
var varC:Float = 20.0
var stringA = "\(varA) 乘于 \(constA) 等于 \(varC * 100)"
print( stringA )
以上程序執(zhí)行輸出結(jié)果為:
20 乘于 100 等于 2000.0
字符串連接
字符串可以通過 + 號(hào)來連接,實(shí)例如下:
import Cocoa
let constA = "夏天:"
let constB = "你好"
var stringA = constA + constB
print( stringA )
以上程序執(zhí)行輸出結(jié)果為:
夏天:你好
字符串長度
字符串長度使用 String.count 屬性來計(jì)算船侧,實(shí)例如下:
import Cocoa
var varA ? = "www.runoob.com"
print( "\(varA), 長度為 \(varA.count)" )
以上程序執(zhí)行輸出結(jié)果為:
www.runoob.com, 長度為 14
字符串比較
你可以使用 == 來比較兩個(gè)字符串是否相等:
import Cocoa
var varA ? = "Hello, Swift!"
var varB ? = "Hello, World!"
if varA == varB {
? ? print( "\(varA) 與 \(varB) 是相等的" )
} else {
? ? print( "\(varA) 與 \(varB) 是不相等的" )
}
以上程序執(zhí)行輸出結(jié)果為:
Hello, Swift! 與 Hello, World! 是不相等的
Unicode 字符串
Unicode 是一個(gè)國際標(biāo)準(zhǔn)欠气,用于文本的編碼,Swift 的 String 類型是基于 Unicode建立的镜撩。你可以循環(huán)迭代出字符串中 UTF-8 與 UTF-16 的編碼预柒,實(shí)例如下:
import Cocoa
var unicodeString ? = "你好夏天"
print("UTF-8 編碼: ")
for code in unicodeString.utf8 {
? ? print("\(code) ")
}
print("\n")
print("UTF-16 編碼: ")
for code in unicodeString.utf16 {
? ? print("\(code) ")
}
以上程序執(zhí)行輸出結(jié)果為:
UTF-8 編碼:?
228?
189?
160?
229?
165?
189?
229?
164?
143?
229?
164?
169?
UTF-16 編碼:?
20320?
22909?
22799?
22825?
字符串函數(shù)及運(yùn)算符
Swift 支持以下幾種字符串函數(shù)及運(yùn)算符:
isEmpty? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 判斷字符串是否為空,返回布爾值
hasPrefix(prefix: String)? ? 檢查字符串是否擁有特定前綴
hasSuffix(suffix: String)? ? 檢查字符串是否擁有特定后綴袁梗。
Int(String)? ? ? ? ? ? ? ? ? ? ? ? ? ? 轉(zhuǎn)換字符串?dāng)?shù)字為整型宜鸯。
String.count? ? ? ? ? ? ? ? ? ? ? ? 計(jì)算字符串的長度
utf8? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 您可以通過遍歷 String 的 utf8 屬性來訪問它的 UTF-8 編碼
utf16? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 您可以通過遍歷 String 的 utf8 屬性來訪問它的 utf16 編碼
unicodeScalars 您可以通過遍歷String值的unicodeScalars屬性來訪問它的 Unicode 標(biāo)量編碼.
+ 連接兩個(gè)字符串,并返回一個(gè)新的字符串
+= 連接操作符兩邊的字符串并將新字符串賦值給左邊的操作符變量
== ? ? ? ? 判斷兩個(gè)字符串是否相等
< 比較兩個(gè)字符串遮怜,對(duì)兩個(gè)字符串的字母逐一比較淋袖。
!= 比較兩個(gè)字符串是否不相等。
十一.字符(Character)
Swift 的字符是一個(gè)單一的字符字符串字面量锯梁,數(shù)據(jù)類型為 Character即碗。
以下實(shí)例列出了兩個(gè)字符實(shí)例:
import Cocoa
let char1: Character = "A"
let char2: Character = "B"
print("char1 的值為 \(char1)")
print("char2 的值為 \(char2)")
以上程序執(zhí)行輸出結(jié)果為:
char1 的值為 A
char2 的值為 B
如果你想在 Character(字符) 類型的常量中存儲(chǔ)更多的字符焰情,則程序執(zhí)行會(huì)報(bào)錯(cuò),如下所示:
import Cocoa
// Swift 中以下賦值會(huì)報(bào)錯(cuò)
let char: Character = "AB"
print("Value of char \(char)")
以上程序執(zhí)行輸出結(jié)果為:
error: cannot convert value of type 'String' to specified type 'Character'
let char: Character = "AB"
空字符變量
Swift 中不能創(chuàng)建空的 Character(字符) 類型變量或常量:
import Cocoa
// Swift 中以下賦值會(huì)報(bào)錯(cuò)
let char1: Character = ""
var char2: Character = ""
print("char1 的值為 \(char1)")
print("char2 的值為 \(char2)")
以上程序執(zhí)行輸出結(jié)果為:
error: cannot convert value of type 'String' to specified type 'Character'
let char1: Character = ""
? ? ^~
error: cannot convert value of type 'String' to specified type 'Character'
var char2: Character = ""
遍歷字符串中的字符
Swift 的 String 類型表示特定序列的 Character(字符) 類型值的集合剥懒。 每一個(gè)字符值代表一個(gè) Unicode 字符内舟。
您可通過for-in循環(huán)來遍歷字符串中的characters屬性來獲取每一個(gè)字符的值:
import Cocoa
for ch in "Runoob".characters {
? ? print(ch)
}
以上程序執(zhí)行輸出結(jié)果為:
R
u
n
o
o
b
字符串連接字符
以下實(shí)例演示了使用 String 的 append() 方法來實(shí)現(xiàn)字符串連接字符:
import Cocoa
var varA:String = "Hello "
let varB:Character = "G"
varA.append( varB )
print("varC? =? \(varA)")
以上程序執(zhí)行輸出結(jié)果為:
varC? =? Hello G
十二. 數(shù)組
Swift 數(shù)組使用有序列表存儲(chǔ)同一類型的多個(gè)值。相同的值可以多次出現(xiàn)在一個(gè)數(shù)組的不同位置中初橘。
Swift 數(shù)組會(huì)強(qiáng)制檢測元素的類型验游,如果類型不同則會(huì)報(bào)錯(cuò),Swift 數(shù)組應(yīng)該遵循像Array<Element>這樣的形式保檐,其中Element是這個(gè)數(shù)組中唯一允許存在的數(shù)據(jù)類型耕蝉。
如果創(chuàng)建一個(gè)數(shù)組,并賦值給一個(gè)變量夜只,則創(chuàng)建的集合就是可以修改的垒在。這意味著在創(chuàng)建數(shù)組后,可以通過添加盐肃、刪除、修改的方式改變數(shù)組里的項(xiàng)目权悟。如果將一個(gè)數(shù)組賦值給常量砸王,數(shù)組就不可更改,并且數(shù)組的大小和內(nèi)容都不可以修改峦阁。
創(chuàng)建數(shù)組
我們可以使用構(gòu)造語法來創(chuàng)建一個(gè)由特定數(shù)據(jù)類型構(gòu)成的空數(shù)組:
var someArray = [SomeType]()
以下是創(chuàng)建一個(gè)初始化大小數(shù)組的語法:
var someArray = [SomeType](repeating: InitialValue, count: NumbeOfElements)
以下實(shí)例創(chuàng)建了一個(gè)類型為 Int 谦铃,數(shù)量為 3,初始值為 0 的空數(shù)組:
var someInts = [Int](repeating: 0, count: 3)
以下實(shí)例創(chuàng)建了含有三個(gè)元素的數(shù)組:
var someInts:[Int] = [10, 20, 30]
訪問數(shù)組
我們可以根據(jù)數(shù)組的索引來訪問數(shù)組的元素榔昔,語法如下:
var someVar = someArray[index]
index 索引從 0 開始驹闰,即索引 0 對(duì)應(yīng)第一個(gè)元素,索引 1 對(duì)應(yīng)第二個(gè)元素撒会,以此類推嘹朗。
我們可以通過以下實(shí)例來學(xué)習(xí)如何創(chuàng)建,初始化诵肛,訪問數(shù)組:
import Cocoa
var someInts = [Int](repeating: 10, count: 3)
var someVar = someInts[0]
print( "第一個(gè)元素的值 \(someVar)" )
print( "第二個(gè)元素的值 \(someInts[1])" )
print( "第三個(gè)元素的值 \(someInts[2])" )
以上程序執(zhí)行輸出結(jié)果為:
第一個(gè)元素的值 10
第二個(gè)元素的值 10
第三個(gè)元素的值 10
修改數(shù)組
你可以使用 append() 方法或者賦值運(yùn)算符 += 在數(shù)組末尾添加元素屹培,如下所示,我們初始化一個(gè)數(shù)組怔檩,并向其添加元素:
import Cocoa
var someInts = [Int]()
someInts.append(20)
someInts.append(30)
someInts += [40]
var someVar = someInts[0]
print( "第一個(gè)元素的值 \(someVar)" )
print( "第二個(gè)元素的值 \(someInts[1])" )
print( "第三個(gè)元素的值 \(someInts[2])" )
以上程序執(zhí)行輸出結(jié)果為:
第一個(gè)元素的值 20
第二個(gè)元素的值 30
第三個(gè)元素的值 40
我們也可以通過索引修改數(shù)組元素的值:
import Cocoa
var someInts = [Int]()
someInts.append(20)
someInts.append(30)
someInts += [40]
// 修改最后一個(gè)元素
someInts[2] = 50
var someVar = someInts[0]
print( "第一個(gè)元素的值 \(someVar)" )
print( "第二個(gè)元素的值 \(someInts[1])" )
print( "第三個(gè)元素的值 \(someInts[2])" )
以上程序執(zhí)行輸出結(jié)果為:
第一個(gè)元素的值 20
第二個(gè)元素的值 30
第三個(gè)元素的值 50
遍歷數(shù)組
我們可以使用for-in循環(huán)來遍歷所有數(shù)組中的數(shù)據(jù)項(xiàng):
import Cocoa
var someStrs = [String]()
someStrs.append("Apple")
someStrs.append("Amazon")
someStrs.append("Runoob")
someStrs += ["Google"]
for item in someStrs {
? ? print(item)
}
以上程序執(zhí)行輸出結(jié)果為:
Apple
Amazon
Runoob
如果我們同時(shí)需要每個(gè)數(shù)據(jù)項(xiàng)的值和索引值褪秀,可以使用 String 的 enumerate() 方法來進(jìn)行數(shù)組遍歷。實(shí)例如下:
import Cocoa
var someStrs = [String]()
someStrs.append("Apple")
someStrs.append("Amazon")
someStrs.append("Runoob")
someStrs += ["Google"]
for (index, item) in someStrs.enumerated() {
? ? print("在 index = \(index) 位置上的值為 \(item)")
}
以上程序執(zhí)行輸出結(jié)果為:
在 index = 0 位置上的值為 Apple
在 index = 1 位置上的值為 Amazon
在 index = 2 位置上的值為 Runoob
在 index = 3 位置上的值為 Google
合并數(shù)組
我們可以使用加法操作符(+)來合并兩種已存在的相同類型數(shù)組薛训。新數(shù)組的數(shù)據(jù)類型會(huì)從兩個(gè)數(shù)組的數(shù)據(jù)類型中推斷出來:
import Cocoa
var intsA = [Int](repeating: 2, count:2)
var intsB = [Int](repeating: 1, count:3)
var intsC = intsA + intsB
for item in intsC {
? ? print(item)
}
以上程序執(zhí)行輸出結(jié)果為:
2
2
1
1
1
count 屬性
我們可以使用 count 屬性來計(jì)算數(shù)組元素個(gè)數(shù):
import Cocoa
var intsA = [Int](count:2, repeatedValue: 2)
var intsB = [Int](count:3, repeatedValue: 1)
var intsC = intsA + intsB
print("intsA 元素個(gè)數(shù)為 \(intsA.count)")
print("intsB 元素個(gè)數(shù)為 \(intsB.count)")
print("intsC 元素個(gè)數(shù)為 \(intsC.count)")
以上程序執(zhí)行輸出結(jié)果為:
intsA 元素個(gè)數(shù)為 2
intsB 元素個(gè)數(shù)為 3
intsC 元素個(gè)數(shù)為 5
isEmpty 屬性
我們可以通過只讀屬性 isEmpty 來判斷數(shù)組是否為空媒吗,返回布爾值:
import Cocoa
var intsA = [Int](count:2, repeatedValue: 2)
var intsB = [Int](count:3, repeatedValue: 1)
var intsC = [Int]()
print("intsA.isEmpty = \(intsA.isEmpty)")
print("intsB.isEmpty = \(intsB.isEmpty)")
print("intsC.isEmpty = \(intsC.isEmpty)")
以上程序執(zhí)行輸出結(jié)果為:
intsA.isEmpty = false
intsB.isEmpty = false
intsC.isEmpty = true
十三.字典
Swift 字典用來存儲(chǔ)無序的相同類型數(shù)據(jù)的集合,Swift 字典會(huì)強(qiáng)制檢測元素的類型乙埃,如果類型不同則會(huì)報(bào)錯(cuò)闸英。
Swift 字典每個(gè)值(value)都關(guān)聯(lián)唯一的鍵(key)锯岖,鍵作為字典中的這個(gè)值數(shù)據(jù)的標(biāo)識(shí)符。
和數(shù)組中的數(shù)據(jù)項(xiàng)不同自阱,字典中的數(shù)據(jù)項(xiàng)并沒有具體順序嚎莉。我們在需要通過標(biāo)識(shí)符(鍵)訪問數(shù)據(jù)的時(shí)候使用字典,這種方法很大程度上和我們在現(xiàn)實(shí)世界中使用字典查字義的方法一樣沛豌。
Swift 字典的key沒有類型限制可以是整型或字符串趋箩,但必須是唯一的。
如果創(chuàng)建一個(gè)字典加派,并賦值給一個(gè)變量叫确,則創(chuàng)建的字典就是可以修改的。這意味著在創(chuàng)建字典后芍锦,可以通過添加竹勉、刪除、修改的方式改變字典里的項(xiàng)目娄琉。如果將一個(gè)字典賦值給常量次乓,字典就不可修改,并且字典的大小和內(nèi)容都不可以修改孽水。
創(chuàng)建字典
我們可以使用以下語法來創(chuàng)建一個(gè)特定類型的空字典:
var someDict =? [KeyType: ValueType]()
以下是創(chuàng)建一個(gè)空字典票腰,鍵的類型為 Int,值的類型為 String 的簡單語法:
var someDict = [Int: String]()
以下為創(chuàng)建一個(gè)字典的實(shí)例:
var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
訪問字典
我們可以根據(jù)字典的索引來訪問數(shù)組的元素女气,語法如下:
var someVar = someDict[key]
我們可以通過以下實(shí)例來學(xué)習(xí)如何創(chuàng)建杏慰,初始化,訪問字典:
import Cocoa
var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
var someVar = someDict[1]
print( "key = 1 的值為 \(someVar)" )
print( "key = 2 的值為 \(someDict[2])" )
print( "key = 3 的值為 \(someDict[3])" )
以上程序執(zhí)行輸出結(jié)果為:
key = 1 的值為 Optional("One")
key = 2 的值為 Optional("Two")
key = 3 的值為 Optional("Three")
修改字典
我們可以使用 updateValue(forKey:) 增加或更新字典的內(nèi)容炼鞠。如果 key 不存在缘滥,則添加值,如果存在則修改 key 對(duì)應(yīng)的值谒主。updateValue(_:forKey:)方法返回Optional值朝扼。實(shí)例如下:
import Cocoa
var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
var oldVal = someDict.updateValue("One 新的值", forKey: 1)
var someVar = someDict[1]
print( "key = 1 舊的值 \(oldVal)" )
print( "key = 1 的值為 \(someVar)" )
print( "key = 2 的值為 \(someDict[2])" )
print( "key = 3 的值為 \(someDict[3])" )
以上程序執(zhí)行輸出結(jié)果為:
key = 1 舊的值 Optional("One")
key = 1 的值為 Optional("One 新的值")
key = 2 的值為 Optional("Two")
key = 3 的值為 Optional("Three")
你也可以通過指定的 key 來修改字典的值,如下所示:
import Cocoa
var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
var oldVal = someDict[1]
someDict[1] = "One 新的值"
var someVar = someDict[1]
print( "key = 1 舊的值 \(oldVal)" )
print( "key = 1 的值為 \(someVar)" )
print( "key = 2 的值為 \(someDict[2])" )
print( "key = 3 的值為 \(someDict[3])" )
以上程序執(zhí)行輸出結(jié)果為:
key = 1 舊的值 Optional("One")
key = 1 的值為 Optional("One 新的值")
key = 2 的值為 Optional("Two")
key = 3 的值為 Optional("Three")
移除 Key-Value 對(duì)
我們可以使用 removeValueForKey() 方法來移除字典 key-value 對(duì)霎肯。如果 key 存在該方法返回移除的值吟税,如果不存在返回 nil 。實(shí)例如下:
import Cocoa
var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
var removedValue = someDict.removeValue(forKey: 2)
print( "key = 1 的值為 \(someDict[1])" )
print( "key = 2 的值為 \(someDict[2])" )
print( "key = 3 的值為 \(someDict[3])" )
以上程序執(zhí)行輸出結(jié)果為:
key = 1 的值為 Optional("One")
key = 2 的值為 nil
key = 3 的值為 Optional("Three")
你也可以通過指定鍵的值為 nil 來移除 key-value(鍵-值)對(duì)姿现。實(shí)例如下:
import Cocoa
var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
someDict[2] = nil
print( "key = 1 的值為 \(someDict[1])" )
print( "key = 2 的值為 \(someDict[2])" )
print( "key = 3 的值為 \(someDict[3])" )
以上程序執(zhí)行輸出結(jié)果為:
key = 1 的值為 Optional("One")
key = 2 的值為 nil
key = 3 的值為 Optional("Three")
遍歷字典
我們可以使用 for-in 循環(huán)來遍歷某個(gè)字典中的鍵值對(duì)肠仪。實(shí)例如下:
import Cocoa
var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
for (key, value) in someDict {
? ? print("字典 key \(key) -? 字典 value \(value)")
}
以上程序執(zhí)行輸出結(jié)果為:
字典 key 2 -? 字典 value Two
字典 key 3 -? 字典 value Three
字典 key 1 -? 字典 value One
我們也可以使用enumerate()方法來進(jìn)行字典遍歷,返回的是字典的索引及 (key, value) 對(duì)备典,實(shí)例如下:
import Cocoa
var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
for (key, value) in someDict.enumerated() {
? ? print("字典 key \(key) -? 字典 (key, value) 對(duì) \(value)")
}
以上程序執(zhí)行輸出結(jié)果為:
字典 key 0 -? 字典 (key, value) 對(duì) (2, "Two")
字典 key 1 -? 字典 (key, value) 對(duì) (3, "Three")
字典 key 2 -? 字典 (key, value) 對(duì) (1, "One")
字典轉(zhuǎn)換為數(shù)組
你可以提取字典的鍵值(key-value)對(duì)异旧,并轉(zhuǎn)換為獨(dú)立的數(shù)組。實(shí)例如下:
import Cocoa
var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
let dictKeys = [Int](someDict.keys)
let dictValues = [String](someDict.values)
print("輸出字典的鍵(key)")
for (key) in dictKeys {
? ? print("\(key)")
}
print("輸出字典的值(value)")
for (value) in dictValues {
? ? print("\(value)")
}
以上程序執(zhí)行輸出結(jié)果為:
輸出字典的鍵(key)
2
3
1
輸出字典的值(value)
Two
Three
One
count 屬性
我們可以使用只讀的 count 屬性來計(jì)算字典有多少個(gè)鍵值對(duì):
import Cocoa
var someDict1:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
var someDict2:[Int:String] = [4:"Four", 5:"Five"]
print("someDict1 含有 \(someDict1.count) 個(gè)鍵值對(duì)")
print("someDict2 含有 \(someDict2.count) 個(gè)鍵值對(duì)")
以上程序執(zhí)行輸出結(jié)果為:
someDict1 含有 3 個(gè)鍵值對(duì)
someDict2 含有 2 個(gè)鍵值對(duì)
isEmpty 屬性
Y我們可以通過只讀屬性 isEmpty 來判斷字典是否為空提佣,返回布爾值:
import Cocoa
var someDict1:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
var someDict2:[Int:String] = [4:"Four", 5:"Five"]
var someDict3:[Int:String] = [Int:String]()
print("someDict1 = \(someDict1.isEmpty)")
print("someDict2 = \(someDict2.isEmpty)")
print("someDict3 = \(someDict3.isEmpty)")
以上程序執(zhí)行輸出結(jié)果為:
someDict1 = false
someDict2 = false
someDict3 = true