Swift 基礎(chǔ)知識(shí)點(diǎn)總結(jié)(一)

一.基本語法

引入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

Google

如果我們同時(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吮蛹,一起剝皮案震驚了整個(gè)濱河市荤崇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌潮针,老刑警劉巖术荤,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異每篷,居然都是意外死亡瓣戚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門焦读,熙熙樓的掌柜王于貴愁眉苦臉地迎上來子库,“玉大人,你說我怎么就攤上這事矗晃÷匦幔” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵张症,是天一觀的道長仓技。 經(jīng)常有香客問我,道長俗他,這世上最難降的妖魔是什么脖捻? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮拯辙,結(jié)果婚禮上郭变,老公的妹妹穿的比我還像新娘颜价。我一直安慰自己涯保,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布周伦。 她就那樣靜靜地躺著夕春,像睡著了一般。 火紅的嫁衣襯著肌膚如雪专挪。 梳的紋絲不亂的頭發(fā)上及志,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音寨腔,去河邊找鬼速侈。 笑死,一個(gè)胖子當(dāng)著我的面吹牛迫卢,可吹牛的內(nèi)容都是我干的倚搬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼乾蛤,長吁一口氣:“原來是場噩夢啊……” “哼每界!你這毒婦竟也來了捅僵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤眨层,失蹤者是張志新(化名)和其女友劉穎庙楚,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趴樱,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡馒闷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伊佃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窜司。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖航揉,靈堂內(nèi)的尸體忽然破棺而出塞祈,到底是詐尸還是另有隱情,我是刑警寧澤帅涂,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布议薪,位于F島的核電站,受9級(jí)特大地震影響媳友,放射性物質(zhì)發(fā)生泄漏斯议。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一醇锚、第九天 我趴在偏房一處隱蔽的房頂上張望哼御。 院中可真熱鬧,春花似錦焊唬、人聲如沸恋昼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽液肌。三九已至,卻和暖如春鸥滨,著一層夾襖步出監(jiān)牢的瞬間嗦哆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工婿滓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留老速,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓凸主,卻偏偏與公主長得像橘券,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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