字符串
字符串在任何的開發(fā)中使用都是非常頻繁的
OC和Swift中字符串的區(qū)別
? 1. 在OC中字符串類型時(shí)NSString,在Swift中字符串類型是String
? 2. OC中字符串@””,Swift中字符串””
使用 String 的原因
? 1.String 是一個(gè)結(jié)構(gòu)體,性能更高
? 2. NSString 是一個(gè) OC 對(duì)象,性能略差
? 3. String 支持直接遍歷
? 4. Swift 提供了 String 和 NSString 之間的無縫轉(zhuǎn)換
定義不可變字符
let str = "hello world"
?遍歷字符串
for c in str.characters {
print(c)
}
定義可變字符
var strM = "hello swift"
獲取字符串的長(zhǎng)度
先獲取字符集合 在獲取集合的count屬性
let count = str.characters.count
字符串的拼接
let str3 = str + strM
字符串和其它數(shù)據(jù)類型的拼接
let name = "lwy"
let age = 18
//OC中是 NSString *info = [NSString stringWithFormat:@"my name is %@, age is %d", name, age];
let info = "my name is (name),age is (age)"
字符串的格式化 比如時(shí)間格式 想要把時(shí)間格式顯示為 xx:xx
let min = 30
let second = 4
// swift中數(shù)組可以存儲(chǔ)基本數(shù)據(jù)類型 字典也可以 但是在OC中不可以
// %0ad: a是一個(gè)數(shù)字, 表示如果數(shù)字位數(shù)不足a位的話, 數(shù)字前面加0, 補(bǔ)足a位, 如果超過a位, 則前面什么都不加;例如 %02d 表示的是如果數(shù)字不足兩位的話前面補(bǔ)0 ,補(bǔ)足位兩位 ,如果數(shù)字超過兩位, 則什么都不補(bǔ), %03d表示不足3位的話前面補(bǔ)0 ,補(bǔ)足為3位
let time = String(format:"%03d:%02d", arguments:[min,second])
字符串的截取
Swift中提供了特殊的截取方式 該方式非常麻煩 Index創(chuàng)建較為麻煩 簡(jiǎn)單的方式是將String轉(zhuǎn)成NSString來使用 在標(biāo)識(shí)符后加:as NSString即可
let urlString = "www.baidu.com"
//把urlString轉(zhuǎn)為NSString再截取字符串 截取之后的字符串是String類型 不是NSString
let header = (urlString as NSString).substring(to: 3)//截取www字符串
let middle = (urlString as NSString).substring(with: NSMakeRange(4, 5))//截取baidu字符串
let footer = (urlString as NSString).substring(from: 10)
swift截取方式
let headerIndex = urlString.index(urlString.startIndex, offsetBy: 3)
let header2 = urlString.substring(to: headerIndex)
let footerIndex = urlString.index(urlString.endIndex, offsetBy: -3)
let footer2 = urlString.substring(from: footerIndex)
let startIndex = urlString.index(urlString.startIndex, offsetBy: 4)
let endIndex = urlString.index(urlString.startIndex, offsetBy: 9)
let range2 = Range(startIndex..
let middle2 = urlString.substring(with: range2)
數(shù)組
數(shù)組(Array)是一串有序的由相同類型元素構(gòu)成的集合,數(shù)組中的集合元素是有序的简软,可以重復(fù)出現(xiàn), swift數(shù)組類型是Array伯病,是一個(gè)泛型集合 必須告訴數(shù)組存放的是什么類型
數(shù)組的定義
定義不可變數(shù)組 let修飾的數(shù)組就是不可變數(shù)組
let array = ["lwy","zym","rx"]// 點(diǎn)擊alt鍵可以看到他的類型是 array:[String]類型 所以也可以寫成這樣
let arr :[String] = ["132"]
定義存放any類型的不可變數(shù)組
let arrayAny :[Any] = ["123","456",18,20]
或者
let arrAny = ["132","123",30] as [Any]
定義可變數(shù)組
OC中是[NSMutableArray array];方式創(chuàng)建的, 在swift中創(chuàng)建對(duì)象的方式是: 類型() 的形式創(chuàng)建, 比如UIView() 創(chuàng)建一個(gè)view,可以得出數(shù)組的話應(yīng)該是 var arrM = Array()創(chuàng)建, 但是會(huì)發(fā)現(xiàn)這樣寫的話是會(huì)報(bào)錯(cuò)的, 因?yàn)閿?shù)組是一個(gè)泛型集合, 必須告訴數(shù)組應(yīng)該存放什么樣的類型
//var arrM = Array() 錯(cuò)誤的寫法
var arrayM = Array() // 正確的寫法 定義一個(gè)存放字符類型的可變數(shù)組 不過很少用到
var arrM =String// 這種寫法比較多一些 定義存放any類型的可變數(shù)組 var arrayMAny =Any
數(shù)組的操作
增加元素
arrayM.append("lwy")
arrayM.append("zhangsan")
arrayM.append("lisi")
arrayM.append("wangwu")
arrayM.append("zhouliu")
arrayM.append("shengqi")
修改元素 直接賦值給相應(yīng)的下標(biāo)
arrayM[0] = "wangwu"
arrayM
刪除元素 會(huì)返回刪除的數(shù)據(jù)
let one = arrayM.remove(at: 1)
arrayM
let last = arrayM.removeLast()
獲取某個(gè)下標(biāo)的元素
arrayM[0]
array[0]
遍歷數(shù)組
1.需要用到下標(biāo)
for i in 0..
print(arrayM[i])
}
2.不需要用到下標(biāo)
for name in arrayM {
print(name)
}
3.不常見的 比如 只是想遍歷數(shù)組中的前兩個(gè)元素
for i in 0..<2 {
print(arrayM[i])
}
或者
for name in arrayM[0..<2] {
print(name)
}
遍歷數(shù)組的同時(shí)獲取下標(biāo)值
let names = ["why", "yz", "lnj", "lmj"]
for (index, name) in names.enumerated() {
print(index)
print(name)
}
數(shù)組的合并
比如想把a(bǔ)rray不可變數(shù)組和arrayM數(shù)組合并在一塊 如果用OC的方法的話應(yīng)該是這樣的
for name in array {
arrayM.append(name)
}
swift的話可以直接相加
let result = arrayM + array
不過需要注意的是只有兩個(gè)數(shù)組的類型是完全一樣的時(shí)候才可以相加合并 不同類型的話是不能相加合并的 比如一個(gè)數(shù)組中存放的是數(shù)字 另一個(gè)數(shù)組存放的是字符 這時(shí)候這兩個(gè)數(shù)組是不能相加的
不建議一個(gè)數(shù)組中存放多種類型的數(shù)據(jù)
var array3 :[Any] = [2, 3, "why"]
var array4 :[Any] = ["yz", 23]
array3 + array4
字典?
跟OC中一樣 都是無序的逛球,字典允許按照某個(gè)鍵來訪問元素
字典是由兩部分集合構(gòu)成的蕴忆,一個(gè)是鍵(key)集合仗岖,一個(gè)是值(value)集合
鍵集合是不能有重復(fù)元素的金麸,而值集合是可以重復(fù)的擎析,鍵和值是成對(duì)出現(xiàn)的
Swift字典類型是Dictionary,也是一個(gè)泛型集合
定義一個(gè)不可變字典
let dict1 : [String : Any] = ["name" : "why", "age" : 18]
可以理解為轉(zhuǎn)換為String:Any類型的字典
let dict2 = ["name":"lwy","age":18] as [String : Any]
定義可變字典
var dictM =String : Any
可變字典的操作
增加元素
dictM["name"] = "lwy"
dictM["age"] = 18
dictM["height"] = 170.0
dictM
刪除數(shù)據(jù) 會(huì)返回刪除的value
let nameValue = dictM.removeValue(forKey: "height")
dictM
修改數(shù)據(jù)
dictM["name"] = "yw"
或者
dictM.updateValue("yu", forKey: "name")
可以看到修改數(shù)據(jù)和增加數(shù)據(jù)的方法是一樣的 也就是當(dāng)我們修改一個(gè)不存在的key的數(shù)據(jù)時(shí) 就會(huì)增加一個(gè)相應(yīng)key的數(shù)據(jù)
查詢字典
dictM["name"]
字典的遍歷
遍歷所有的值
for value in dict1.values {
print(value)
}
遍歷所有的key
for key in dict1.keys {
print(key)
}
遍歷所有的鍵值對(duì)
for (key, value) in dict1 {
print(key)
print(value)
}
字典的合并
var dictM1 = ["name":"lwy","age":20] as [String : Any]
var dictM2 : [String : Any] = ["height":18 ,"phoneNum":"10086"]
字典的合并不能像數(shù)組那樣直接相加合并 即使字典的類型完全一致也不可以相加
dictM1 + dictM2 dictM1和dictM2是完全一樣的類型 但是也不能相加 這樣是錯(cuò)誤的
for (key, value) in dictM1 {
dictM2[key] = value
}