上一篇中學(xué)習(xí)了基本類型和基本語(yǔ)法后,這一篇主要記錄一下有關(guān)字符串,數(shù)組,字典等數(shù)據(jù)結(jié)構(gòu)的使用方式。
字符串
在swift中,字符串同樣也分為可變字符串和不可變字符串
1.不可變字符串的創(chuàng)建
let str = "hello world"
let關(guān)鍵字下的字符串都是不可變的,不能重新賦值
2.求字符串長(zhǎng)度
let length = str.characters.count
與oc不同,swift中沒(méi)有l(wèi)ength方法來(lái)獲取長(zhǎng)度,但可以通過(guò)獲取原串的總數(shù)來(lái)獲取長(zhǎng)度。
3.字符串格式化
let name = "zzq"
let age = 25
let height = 180
let infoStr = "name = \(name) age = \(age) height = \(height)"
在swift中,拼接字符串不需要使用oc那樣的format方式,采用(xxx)的格式就可以把外部變量傳入字符串中了
let min = 3
let second = 12
let timeStr = String(format:"%02d:%02d",min,second)
對(duì)于數(shù)字類型,我們也可以使用format方式進(jìn)行格式設(shè)定
4.字符串截取
let urlString = "www.baidu.com"
let header = (urlString as NSString).substring(to: 3)
let middle = (urlString as NSString).substring(with: NSMakeRange(4, 5))
let footer = (urlString as NSString).substring(from: 10)
在swift中截取字符串可以將String類型先轉(zhuǎn)換成NSString
類型,再通過(guò)NSString
中提供的API進(jìn)行截取。
5.字符串拼接
let str1 = "aaa"
let str2 = "bbb"
let str3 = str1 + str2
在swift中,我們可以直接使用 + 方法拼接多個(gè)字符串
數(shù)組Array
與oc相同,數(shù)組也分為可變與不可變數(shù)組
1.不可變數(shù)組的聲明
聲明指定類型的數(shù)組
方式一、
let array : Array<String> = ["aa","bb","cc"]
方式二、
let array : [String] = ["aa","bb","cc"]
聲明任意類型的數(shù)組
let array : Any = ["aa","bb",123]
可以通過(guò)Any關(guān)鍵字告訴編譯器數(shù)組中內(nèi)容類型是任意的
2.可變數(shù)組的聲明
方式一、
var array = Array<String>()
方式二、
var array = [String]()
3.可變數(shù)組的操作
1>添加---append
array.append("1")
array.append("2")
array.append("3")
2>移除--remove
//移除所有元素
array.removeAll()
//移除指定位置的
array.remove(at: 0)
//移除第一個(gè)
array.removeFirst()
//移除最后一個(gè)
array.removeLast()
3>修改
array[0] = "zzq"
4>遍歷
方式一,通過(guò)下標(biāo)遍歷數(shù)組
for i in 0..<arrayM.count {
print(arrayM[i])
}
方式二,直接獲取數(shù)組中的元素
for item in arrayM {
print(item)
}
方式三,通過(guò)枚舉方式遍歷
for (index, item) in arrayM.enumerated() {
print(index)
print(item)
}
4.數(shù)組的合并
let array1 : [String] = ["aa","bb"]
let array2 : [String] = ["test","1","2"]
let array 3= array1 + array2
與字符串類似,相同類型的數(shù)字也可以通過(guò) + 直接合并
字典Dictionary
初始化不可變字典
方式一、
let dict : Dictionary<String,Any> = ["key1":"1","key2":2]
方式二、
var dict1 = ["key1":1,"key2":"2","key3":3] as [String:Any]
方式三、
let dict2 : [String : Any] = ["key1":"value","key2":123,"key3":"str"]
注意的是,在初始化字典的時(shí)候需要指定value的類型
初始化可變字典
var dictM = [String:Any]()
var dictM1 = Dictionary<String, Any>()
操作可變字典
1>添加
與oc一樣,直接設(shè)置key-value,如果字典中沒(méi)有這個(gè)key,則添加
let dict = [String : Any] ()
dict["name"] = "zzq"
dict["age"] = 22
dict["height"] = 181
2>移除
dict.removeValue(forKey: "age")
3.修改
方式一、同上,當(dāng)存在該key時(shí),更新key對(duì)應(yīng)的value
dict["name"] = "zzq"
方式二、通過(guò)updateValue函數(shù)進(jìn)行更新,效果與方式一一樣。
dict.updateValue("zzq", forKey: "name")
遍歷字典
//遍歷key
for key in dict.keys {
print(key)
}
//遍歷value
for value in dict.values {
print(value)
}
//遍歷key-value
for (key,value) in dict {
print(key,value)
}
合并字典
與字符串,數(shù)組不同,字典不能通過(guò) + 來(lái)進(jìn)行合并,需要手動(dòng)遍歷添加
var dict1 = ["1":1,"2":"2","3":2] as [String:Any]
let dict2 : [String : Any] = ["name":"zhu","age":25,"height":181]
for (key,value) in dict2 {
dict1[key] = value
}
將不可變字典dict2中的鍵值對(duì),添加進(jìn)可變字典dict1中,如果dict1中有相同key的鍵值對(duì),則會(huì)將dict1中該key的value覆蓋
元組
同樣是數(shù)據(jù)集合,與數(shù)組,字典不同的是,元祖可以直接獲取value的類型。先來(lái)看看數(shù)組和字典,當(dāng)我們需要獲取一個(gè)字符串,并打印它的長(zhǎng)度時(shí)
//對(duì)比數(shù)組
let infoArr : [Any] = ["name",18,181]
let arrname = infoArr[0] as! String
print(arrname.characters.count)
//對(duì)比字典
let infodict : [String : Any] = ["name":"zzq","age":22,"sex":1]
let dictName = infodict["name"] as! String
我們可以看到,對(duì)于Any類型的集合,即使獲取一個(gè)string類型的變量,也必須先轉(zhuǎn)換一次才能進(jìn)行操作。再看看元組
下標(biāo)獲取
let infoTuple = ("zzq",22,111,181)
let tupleName = infoTuple.0
這個(gè)時(shí)候獲取的就已經(jīng)是字符串類型了
鍵值對(duì)獲取
let infoTuple1 = (name : "mingzi",age : 12,text : "asd",num : 222)
let name = infoTuple1.name
let text = infoTuple1.text
let num = infoTuple1.num
print(nameT.characters.count) //可以直接打印 打印結(jié)果6
直接構(gòu)造元組結(jié)構(gòu)
let (nameT, ageT, heightT) = ("zzq",25,181)
let name = nameT
let age = ageT
let height = heightT
print(nameT.characters.count) //可以直接打印 打印結(jié)果3
可選類型
使用可選類型主要是為了再處理空的情況下,可以更嚴(yán)謹(jǐn)?shù)呐袛唷2⑶以趕wift中只有可選類型才能賦值為nil,其他類型不能賦值為nil
1.聲明可選類型變量
//1>普通
var name : Optional<String> = nil;
//2>語(yǔ)法糖
var name : String? = nil
可以使用Optional關(guān)鍵字聲明,也可以通過(guò)swift語(yǔ)法糖進(jìn)行聲明
2.可選類型賦值
//1>
name = Optional("what")
//2>
name = "hehehe"
同樣可以使用Optional關(guān)鍵字來(lái)賦值,或者直接賦值由編譯器進(jìn)行判斷
3.取出可選類型的值
對(duì)于可選類型,我們不能直接使用,而需要對(duì)它進(jìn)行解包
1>強(qiáng)制解包,格式:變量!
name是一個(gè)可選類型的字符串
print(name!)
需要注意的是,如果可選類型為nil,強(qiáng)制解包會(huì)導(dǎo)致崩潰
2>可選綁定(固定格式if let)
if let tempname = name {
print(tempname)
}
如果name不為nil,則解包到臨時(shí)變量中,并執(zhí)行括弧內(nèi)的代碼,如果name=nil則不解包,不執(zhí)行括弧內(nèi)代碼。
4.可選類型應(yīng)用場(chǎng)景
//字符串轉(zhuǎn)int
let str = "123"
let num : Int? = Int(str)//123/nil
//根據(jù)文件嗎獲取文件路徑
let path :String? = Bundle.main.path(forResource: "123.plist", ofType: nil) //string/nil
//將字符串轉(zhuǎn)NSURL
//若字符串有中文,返回url/nil
let url : NSURL? = NSURL(string:"www.baidu.com")
//從字典中取出元素
let dict : [String : Any] = ["name":"zzq","age":11]
let value = dict["name"] //Any/nil
開(kāi)發(fā)中遇到可選類型的地方很多,對(duì)于可能出現(xiàn)nil的地方都要使用可選類型進(jìn)行檢查。
類型轉(zhuǎn)換
1.通過(guò)as?轉(zhuǎn)換為可選類型
//Any類型的value不能直接使用
let dict = ["name":"zzq","age":19,"height":1.81] as [String : Any]
//通過(guò)as?進(jìn)行轉(zhuǎn)換
if let name = dict["name"] as? String {
print(name)
}
注意:系統(tǒng)會(huì)自動(dòng)判斷tempName是否可以轉(zhuǎn)成String,如果轉(zhuǎn)化不成功則返回nil
2.通過(guò)as!轉(zhuǎn)換為指定類型
let dict = ["name":"zzq","age":19,"height":1.81] as [String : Any]
let tempname = dict["name"]
let name = tempname as! String
通過(guò)as!轉(zhuǎn)具體類型,轉(zhuǎn)換失敗程序直接崩潰
函數(shù)
swift中函數(shù)的聲明
func 函數(shù)名(參數(shù))-> 返回類型 {
代碼塊
return 返回值
}
構(gòu)造不同類型的幾種函數(shù)
1.無(wú)參數(shù),無(wú)返回值
func test() {
print("test")
}
無(wú)返回值也可以加上->void ,表示返回值類型為void
2.有參數(shù),無(wú)返回值
func testWithParams(param : String) {
print(param)
}
參數(shù)的格式是 參數(shù)名 :類型
3.無(wú)參數(shù),有返回值
func testForReturn() -> String {
return "測(cè)試返回值"
}
4.有參數(shù),有返回值
func sum(num1 : Int , num2 : Int) -> Int {
return num1 + num2
}
另外幾種參數(shù)的定義方式
1.外部參數(shù)
當(dāng)我們希望給參數(shù)取別名時(shí),我們可以設(shè)置外部參數(shù)名
func sum(canshu1 num1 : Int, canshu2 num2 : Int) {
}
//調(diào)用時(shí)顯示
sum(canshu1: 1, canshu2: 2)
在變量名前添加外部變量名 ,這是看到的提示就不是num1而是用canshu1代替
2.隱藏外部參數(shù)
func add(_ num1 : Int, _ num2 : Int) {
}
//調(diào)用時(shí)顯示
add(1, 2)
在參數(shù)名前添加 _ ,這是調(diào)用時(shí)就可以隱藏外部變量參數(shù)了。
3.可變參數(shù)
func change(nums : Int...) -> Int {
var total = 0
for n in nums {
total += n
}
return total
}
調(diào)用顯示
change(nums: 1,2,3,4,5)
在類型后添加...,參數(shù)將變?yōu)橐粋€(gè)數(shù)組類型,我們可以通過(guò)遍歷數(shù)組的方式查看傳入的具體參數(shù)。
4.默認(rèn)參數(shù)值
func makeDefualt(name : String = "默認(rèn)") ->String {
return name;
}
//調(diào)用時(shí)可不傳參數(shù)
makeDefualt()
在類型后添加 = 值 ,可以指定參數(shù)的默認(rèn)值。當(dāng)不傳入該參數(shù)時(shí),使用默認(rèn)值。
5.指針參數(shù)
在swift中,函數(shù)內(nèi)不能直接修改參數(shù)變量
var m : Int = 20
var n : Int = 30
func myswap(num1 : Int,num2 : Int) {
let temp = num1
num1 = num2
num2 = temp
}
上面是一個(gè)錯(cuò)誤的例子,編譯器會(huì)說(shuō)num1.num2是let類型的,不允許修改,我們可以使用臨時(shí)變量獲取參數(shù)的值,但這樣代碼會(huì)變得惡心。
//指針參數(shù)
var m : Int = 20
var n : Int = 30
func myswap(num1 :inout Int,num2 :inout Int) {
let temp = num1
num1 = num2
num2 = temp
}
myswap(num1: &m, num2: &n)
print("m:\(m),n:\(n)")
打印結(jié)果:m:30,n:20
在: 與 類型中間,使用inout關(guān)鍵字可以傳入?yún)?shù)的地址。這樣我們就可以直接對(duì)傳入?yún)?shù)進(jìn)行修改。