版本記錄
版本號(hào) | 時(shí)間 |
---|---|
V1.0 | 2017.07.25 |
前言
我是swift2.0的時(shí)候開始接觸的,記得那時(shí)候還不是很穩(wěn)定蓝牲,公司的項(xiàng)目也都是用oc做的惦费,并不對swift很重視兵迅,我自己學(xué)了一段時(shí)間,到現(xiàn)在swift3.0+已經(jīng)出來了薪贫,自己平時(shí)也不寫恍箭,忘記的也差不多了,正好項(xiàng)目這段時(shí)間已經(jīng)上線了瞧省,不是很忙扯夭,我就可以每天總結(jié)一點(diǎn)了鳍贾,希望對自己對大家有所幫助。在總結(jié)的時(shí)候我會(huì)對比oc進(jìn)行說明交洗,有代碼的我會(huì)給出相關(guān)比對代碼骑科。
1. swift簡單總結(jié)(一)—— 數(shù)據(jù)簡單值和類型轉(zhuǎn)換
2. swift簡單總結(jié)(二)—— 簡單值和控制流
3. swift簡單總結(jié)(三)—— 循環(huán)控制和函數(shù)
4. swift簡單總結(jié)(四)—— 函數(shù)和類
5. swift簡單總結(jié)(五)—— 枚舉和結(jié)構(gòu)體
6. swift簡單總結(jié)(六)—— 協(xié)議擴(kuò)展與泛型
7. swift簡單總結(jié)(七)—— 數(shù)據(jù)類型
8. swift簡單總結(jié)(八)—— 別名、布爾值與元組
9. swift簡單總結(jié)(九)—— 可選值和斷言
10. swift簡單總結(jié)(十)—— 運(yùn)算符
11. swift簡單總結(jié)(十一)—— 字符串和字符
集合類型
swift
與oc
一樣藕筋,都有集合類型纵散,在oc
中集合類型有:
- 數(shù)組(
NSArray/NSMutableArray
) - 字典 (
NSDictionary/NSMutableDictionary
) - 集合(
NSSet
)
他們的優(yōu)缺點(diǎn)就不多說了,很簡單的了隐圾。在swift
中同樣有數(shù)字和字典伍掀。下面就說下這幾種類型。swift
中數(shù)組和字典中存儲(chǔ)的類型必須完全明確暇藏,不能把不正確的數(shù)據(jù)類型存入其中蜜笤,這也說明了我們對從數(shù)組中取值可以極大放心了。
注意:swift
的數(shù)組結(jié)構(gòu)在被聲明成常亮或者被傳入函數(shù)與方法中時(shí)會(huì)相對于其他類型展現(xiàn)出不同的特性盐碱,這個(gè)以后會(huì)詳加闡述把兔。
數(shù)組
數(shù)組使用有序列表存儲(chǔ)同一類型的多個(gè)值,相同的值可以多次出現(xiàn)在一個(gè)數(shù)組的不同位置上瓮顽,swift
與oc
中數(shù)組的定義前幾篇有所涉及县好,這里就不多說了。這里有幾點(diǎn)要注意:
-
oc
中暖混,NSArray
和NSMutableArray
可以存儲(chǔ)任意類型的對象缕贡,不用在數(shù)組定義的時(shí)候就指定存儲(chǔ)類型,并且不提供所返回對象的任何特別的信息拣播。 -
swift
中晾咪,數(shù)據(jù)值被存入某一個(gè)數(shù)組之前,類型必須明確贮配,方式就是通過顯示的類型標(biāo)注或者類型推斷谍倦,而且不是必須是class
類型,整型數(shù)據(jù)也可以泪勒。例如:我們創(chuàng)建Int
類型的數(shù)組昼蛀,就不能往里面添加任何和該類型不同的數(shù)據(jù),swift
中的數(shù)據(jù)類型是安全的酣藻,包含的類型也必須明確曹洽。
1. 數(shù)組構(gòu)造語句
和oc
中一樣,swift
中的數(shù)據(jù)也是使用中括號(hào)包含數(shù)值辽剧,[value1, vaule2, value3]送淆。下面看一下swift
中數(shù)組的簡單定義。
//數(shù)組定義
var numberArr : [Int] = [1, 2, 3, 4]
print(numberArr)
var nameStrArr : [String] = ["John", "Smith"]
print(nameStrArr)
下面看輸出結(jié)果
[1, 2, 3, 4]
["John", "Smith"]
下面看一下oc
中數(shù)組的簡單定義怕轿。
NSArray *numberArr = @[@(1), @(2), @(3), @(4)];
NSLog(@"%@",numberArr);
NSArray *nameStrArr = @[@"John", @"Smith"];
NSLog(@"%@",nameStrArr);
下面看輸出結(jié)果
2017-07-25 10:56:33.954628+0800 JJOC[5185:1639082] (
1,
2,
3,
4
)
2017-07-25 10:56:33.954719+0800 JJOC[5185:1639082] (
John,
Smith
)
這里需要說一下:swift
中用var
表示可變數(shù)組偷崩,而oc
中用NSMutableArray
表示可變數(shù)組辟拷。由于swift
有類型推斷機(jī)制,所以初始化不指定類型阐斜,也會(huì)被推斷出來衫冻,所以上面的代碼也可以這么寫。
//數(shù)組定義
var numberArr = [1, 2, 3, 4]
print(numberArr)
var nameStrArr = ["John", "Smith"]
print(nameStrArr)
2. 訪問和修改數(shù)組
訪問可以訪問可變和不可變數(shù)組谒出,修改數(shù)組則只能修改可變數(shù)組隅俘。
通過count
屬性獲取數(shù)組的數(shù)據(jù)量
先看swift
//數(shù)組定義
var nameStrArr : [String] = ["John", "Smith"]
print(nameStrArr)
print(nameStrArr.count)
下面看輸出結(jié)果
["John", "Smith"]
2
接著看oc
中
NSArray *nameStrArr = @[@"John", @"Smith"];
NSLog(@"%@",nameStrArr);
NSLog(@"%d",nameStrArr.count);
下面看輸出結(jié)果
2017-07-25 11:12:45.626938+0800 JJOC[5193:1640931] (
John,
Smith
)
2017-07-25 11:12:45.626985+0800 JJOC[5193:1640931] 2
檢查數(shù)組是否為空
先看swift
,有個(gè)屬性isEmpty
判斷是否為空笤喳。
var nameStrArr : [String] = ["John", "Smith"]
print(nameStrArr)
print(nameStrArr.count)
if nameStrArr.isEmpty {
print("YES")
}
else {
print("NO")
}
下面看輸出結(jié)果
["John", "Smith"]
2
NO
再看oc
为居,就只能判斷數(shù)組中元素個(gè)數(shù)了。
NSArray *nameStrArr = @[@"John", @"Smith"];
if (nameStrArr.count == 0) {
NSLog(@"YES");
}
else {
NSLog(@"NO");
}
下面看輸出結(jié)果
2017-07-25 11:18:47.220330+0800 JJOC[5201:1642480] NO
增加數(shù)組中的數(shù)據(jù)
swift
中可以通過+
以及append
方法來增加數(shù)組中的數(shù)據(jù)杀狡。下面看代碼蒙畴。
var nameStrArr : [String] = ["John", "Smith"]
nameStrArr += ["Green"]
print(nameStrArr)
nameStrArr.append("David")
print(nameStrArr)
下面看輸出結(jié)果
["John", "Smith", "Green"]
["John", "Smith", "Green", "David"]
下面看oc
中,只能NSMutableArray
可以增加減少數(shù)據(jù)呜象,增加可以用addObject:
方法下面我們看代碼膳凝。
NSArray *nameStrArr = @[@"John", @"Smith"];
NSMutableArray *arrM = [NSMutableArray arrayWithArray:nameStrArr];
[arrM addObject:@"Green"];
NSLog(@"%@",arrM);
[arrM addObjectsFromArray:nameStrArr];
NSLog(@"%@",arrM);
下面看輸出結(jié)果
2017-07-25 11:28:52.907931+0800 JJOC[5212:1646297] (
John,
Smith,
Green
)
2017-07-25 11:28:52.908002+0800 JJOC[5212:1646297] (
John,
Smith,
Green,
John,
Smith
)
通過索引找到和更改數(shù)據(jù)
這個(gè)swift
和oc
都是一樣的,大家記住索引是從0
開始不是從1
開始的就好了恭陡,就會(huì)少出現(xiàn)很多錯(cuò)誤蹬音,典型的就是數(shù)組越界。
swift可以用過下標(biāo)改變一系列的數(shù)據(jù)
下面看這個(gè)例子
var nameStrArr : [String] = ["John", "Smith"]
nameStrArr[0...1] = ["Green", "Rose", "Rechide", "Adail"]
print(nameStrArr)
下面看輸出結(jié)果
["Green", "Rose", "Rechide", "Adail"]
這個(gè)是oc
沒有的語法休玩。
注意: 不能用下標(biāo)語法在數(shù)組尾部添加新項(xiàng)祟绊,可能引起數(shù)組越界,可以使用索引值和數(shù)組的count
屬性進(jìn)行比較來在使用某個(gè)索引之前先檢驗(yàn)有效性哥捕。
插入數(shù)據(jù)
我們先看一下 swift
中插入數(shù)據(jù)的情況。
var nameStrArr : [String] = ["John", "Smith"]
nameStrArr.insert("Lilei", at: 0)
print(nameStrArr)
下面看結(jié)果
["Lilei", "John", "Smith"]
下面我們看oc
中的方法
NSArray *nameStrArr = @[@"John", @"Smith"];
NSMutableArray *arrM = [NSMutableArray arrayWithArray:nameStrArr];
[arrM insertObject:@"Green" atIndex:0];
NSLog(@"%@",arrM);
下面看輸出結(jié)果
["Lilei", "John", "Smith"]
移除數(shù)組中的某一項(xiàng)
下面我們看一下swift
中移除數(shù)組中的某一項(xiàng)嘉熊。oc
和swift
中都有remove object at index
類似方法遥赚,移除某一項(xiàng),也可以調(diào)用removeFirst
阐肤、removeLast
凫佛、removeAll
等方法移除特定的數(shù)據(jù),很簡單和方便孕惜。
var nameStrArr : [String] = ["John", "Smith", "Lilei"]
let firstObj = nameStrArr .remove(at: 0)
print(nameStrArr)
nameStrArr .removeLast()
print(nameStrArr)
下面看輸出結(jié)果
["Smith", "Lilei"]
["Smith"]
這里注意可以返回移除的數(shù)據(jù)愧薛,firstObj
就是返回的數(shù)據(jù),如果不需要衫画,可以不用變量去接收它毫炉。
下面我們看一下oc
中
NSArray *nameStrArr = @[@"John", @"Smith", @"Lilei"];
NSMutableArray *arrM = [NSMutableArray arrayWithArray:nameStrArr];
[arrM removeObjectAtIndex:0];
NSLog(@"%@",arrM);
[arrM removeLastObject];
NSLog(@"%@",arrM);
下面看輸出結(jié)果
2017-07-25 11:52:16.828288+0800 JJOC[5230:1649832] (
Smith,
Lilei
)
2017-07-25 11:52:16.828355+0800 JJOC[5230:1649832] (
Smith
)
創(chuàng)建指定大小的數(shù)組
下面我們就看一下創(chuàng)建指定大小的數(shù)組,先看oc
NSMutableArray *arrM = [NSMutableArray arrayWithCapacity:5];
[arrM addObject:@"Lilei"];
NSLog(@"%@",arrM);
下面看輸出結(jié)果
2017-07-25 12:19:11.844777+0800 JJOC[5243:1653454] (
Lilei
)
下面我們看一下swift
中的用法削罩。
var numberArr = [Double](repeatElement(0.0, count: 3))
print(numberArr)
var numberArr1 = [Double](repeatElement(1.0, count: 3))
print(numberArr1)
var wholeArr = numberArr1 + numberArr
print(wholeArr)
下面看輸出結(jié)果
[0.0, 0.0, 0.0]
[1.0, 1.0, 1.0]
[1.0, 1.0, 1.0, 0.0, 0.0, 0.0]
由于swift
中有類型推斷瞄勾,所以這里的[Double]
可以省略费奸。
3. 數(shù)組的遍歷
數(shù)組的遍歷總是工程中需要的邏輯處理,通過遍歷进陡,在數(shù)組中找到我們感興趣的數(shù)據(jù)愿阐。數(shù)組的遍歷用兩種方法:
-
for - in
遍歷,這個(gè)如果對索引不感興趣可以使用 -
enumerated
函數(shù)趾疚,返回索引和對應(yīng)數(shù)組值
先看一下swift
中缨历。
var nameStrArr : [String] = ["John", "Smith", "Lilei"]
//for - in 遍歷
for name in nameStrArr {
print(name)
}
print("--------")
//enumerate 遍歷
for (index, item) in nameStrArr.enumerated(){
print("\(index): \(item)")
}
下面看輸出結(jié)果
John
Smith
Lilei
--------
0: John
1: Smith
2: Lilei
下面我們就看一下,oc
中的例子糙麦。
NSArray *nameStrArr = @[@"John", @"Smith", @"Lilei"];
//for - in遍歷
for (NSString *name in nameStrArr) {
NSLog(@"%@",name);
}
NSLog(@"---------");
//enumerate遍歷
[nameStrArr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%@",obj);
}];
下面看輸出結(jié)果
2017-07-25 12:02:00.962119+0800 JJOC[5235:1650962] John
2017-07-25 12:02:00.962177+0800 JJOC[5235:1650962] Smith
2017-07-25 12:02:00.962192+0800 JJOC[5235:1650962] Lilei
2017-07-25 12:02:00.962204+0800 JJOC[5235:1650962] ---------
2017-07-25 12:02:00.962224+0800 JJOC[5235:1650962] John
2017-07-25 12:02:00.962238+0800 JJOC[5235:1650962] Smith
2017-07-25 12:02:00.962250+0800 JJOC[5235:1650962] Lilei
后記
未完辛孵,待續(xù)~~~~