版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2017.07.25 |
前言
我是swift2.0的時候開始接觸的,記得那時候還不是很穩定,公司的項目也都是用oc做的,并不對swift很重視,我自己學了一段時間,到現在swift3.0+已經出來了,自己平時也不寫,忘記的也差不多了,正好項目這段時間已經上線了,不是很忙,我就可以每天總結一點了,希望對自己對大家有所幫助。在總結的時候我會對比oc進行說明,有代碼的我會給出相關比對代碼。
1. swift簡單總結(一)—— 數據簡單值和類型轉換
2. swift簡單總結(二)—— 簡單值和控制流
3. swift簡單總結(三)—— 循環控制和函數
4. swift簡單總結(四)—— 函數和類
5. swift簡單總結(五)—— 枚舉和結構體
6. swift簡單總結(六)—— 協議擴展與泛型
7. swift簡單總結(七)—— 數據類型
8. swift簡單總結(八)—— 別名、布爾值與元組
9. swift簡單總結(九)—— 可選值和斷言
10. swift簡單總結(十)—— 運算符
11. swift簡單總結(十一)—— 字符串和字符
集合類型
swift
與oc
一樣,都有集合類型,在oc
中集合類型有:
- 數組(
NSArray/NSMutableArray
) - 字典 (
NSDictionary/NSMutableDictionary
) - 集合(
NSSet
)
他們的優缺點就不多說了,很簡單的了。在swift
中同樣有數字和字典。下面就說下這幾種類型。swift
中數組和字典中存儲的類型必須完全明確,不能把不正確的數據類型存入其中,這也說明了我們對從數組中取值可以極大放心了。
注意:swift
的數組結構在被聲明成常亮或者被傳入函數與方法中時會相對于其他類型展現出不同的特性,這個以后會詳加闡述。
數組
數組使用有序列表存儲同一類型的多個值,相同的值可以多次出現在一個數組的不同位置上,swift
與oc
中數組的定義前幾篇有所涉及,這里就不多說了。這里有幾點要注意:
-
oc
中,NSArray
和NSMutableArray
可以存儲任意類型的對象,不用在數組定義的時候就指定存儲類型,并且不提供所返回對象的任何特別的信息。 -
swift
中,數據值被存入某一個數組之前,類型必須明確,方式就是通過顯示的類型標注或者類型推斷,而且不是必須是class
類型,整型數據也可以。例如:我們創建Int
類型的數組,就不能往里面添加任何和該類型不同的數據,swift
中的數據類型是安全的,包含的類型也必須明確。
1. 數組構造語句
和oc
中一樣,swift
中的數據也是使用中括號包含數值,[value1, vaule2, value3]。下面看一下swift
中數組的簡單定義。
//數組定義
var numberArr : [Int] = [1, 2, 3, 4]
print(numberArr)
var nameStrArr : [String] = ["John", "Smith"]
print(nameStrArr)
下面看輸出結果
[1, 2, 3, 4]
["John", "Smith"]
下面看一下oc
中數組的簡單定義。
NSArray *numberArr = @[@(1), @(2), @(3), @(4)];
NSLog(@"%@",numberArr);
NSArray *nameStrArr = @[@"John", @"Smith"];
NSLog(@"%@",nameStrArr);
下面看輸出結果
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
表示可變數組,而oc
中用NSMutableArray
表示可變數組。由于swift
有類型推斷機制,所以初始化不指定類型,也會被推斷出來,所以上面的代碼也可以這么寫。
//數組定義
var numberArr = [1, 2, 3, 4]
print(numberArr)
var nameStrArr = ["John", "Smith"]
print(nameStrArr)
2. 訪問和修改數組
訪問可以訪問可變和不可變數組,修改數組則只能修改可變數組。
通過count
屬性獲取數組的數據量
先看swift
//數組定義
var nameStrArr : [String] = ["John", "Smith"]
print(nameStrArr)
print(nameStrArr.count)
下面看輸出結果
["John", "Smith"]
2
接著看oc
中
NSArray *nameStrArr = @[@"John", @"Smith"];
NSLog(@"%@",nameStrArr);
NSLog(@"%d",nameStrArr.count);
下面看輸出結果
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
檢查數組是否為空
先看swift
,有個屬性isEmpty
判斷是否為空。
var nameStrArr : [String] = ["John", "Smith"]
print(nameStrArr)
print(nameStrArr.count)
if nameStrArr.isEmpty {
print("YES")
}
else {
print("NO")
}
下面看輸出結果
["John", "Smith"]
2
NO
再看oc
,就只能判斷數組中元素個數了。
NSArray *nameStrArr = @[@"John", @"Smith"];
if (nameStrArr.count == 0) {
NSLog(@"YES");
}
else {
NSLog(@"NO");
}
下面看輸出結果
2017-07-25 11:18:47.220330+0800 JJOC[5201:1642480] NO
增加數組中的數據
swift
中可以通過+
以及append
方法來增加數組中的數據。下面看代碼。
var nameStrArr : [String] = ["John", "Smith"]
nameStrArr += ["Green"]
print(nameStrArr)
nameStrArr.append("David")
print(nameStrArr)
下面看輸出結果
["John", "Smith", "Green"]
["John", "Smith", "Green", "David"]
下面看oc
中,只能NSMutableArray
可以增加減少數據,增加可以用addObject:
方法下面我們看代碼。
NSArray *nameStrArr = @[@"John", @"Smith"];
NSMutableArray *arrM = [NSMutableArray arrayWithArray:nameStrArr];
[arrM addObject:@"Green"];
NSLog(@"%@",arrM);
[arrM addObjectsFromArray:nameStrArr];
NSLog(@"%@",arrM);
下面看輸出結果
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
)
通過索引找到和更改數據
這個swift
和oc
都是一樣的,大家記住索引是從0
開始不是從1
開始的就好了,就會少出現很多錯誤,典型的就是數組越界。
swift可以用過下標改變一系列的數據
下面看這個例子
var nameStrArr : [String] = ["John", "Smith"]
nameStrArr[0...1] = ["Green", "Rose", "Rechide", "Adail"]
print(nameStrArr)
下面看輸出結果
["Green", "Rose", "Rechide", "Adail"]
這個是oc
沒有的語法。
注意: 不能用下標語法在數組尾部添加新項,可能引起數組越界,可以使用索引值和數組的count
屬性進行比較來在使用某個索引之前先檢驗有效性。
插入數據
我們先看一下 swift
中插入數據的情況。
var nameStrArr : [String] = ["John", "Smith"]
nameStrArr.insert("Lilei", at: 0)
print(nameStrArr)
下面看結果
["Lilei", "John", "Smith"]
下面我們看oc
中的方法
NSArray *nameStrArr = @[@"John", @"Smith"];
NSMutableArray *arrM = [NSMutableArray arrayWithArray:nameStrArr];
[arrM insertObject:@"Green" atIndex:0];
NSLog(@"%@",arrM);
下面看輸出結果
["Lilei", "John", "Smith"]
移除數組中的某一項
下面我們看一下swift
中移除數組中的某一項。oc
和swift
中都有remove object at index
類似方法,移除某一項,也可以調用removeFirst
、removeLast
、removeAll
等方法移除特定的數據,很簡單和方便。
var nameStrArr : [String] = ["John", "Smith", "Lilei"]
let firstObj = nameStrArr .remove(at: 0)
print(nameStrArr)
nameStrArr .removeLast()
print(nameStrArr)
下面看輸出結果
["Smith", "Lilei"]
["Smith"]
這里注意可以返回移除的數據,firstObj
就是返回的數據,如果不需要,可以不用變量去接收它。
下面我們看一下oc
中
NSArray *nameStrArr = @[@"John", @"Smith", @"Lilei"];
NSMutableArray *arrM = [NSMutableArray arrayWithArray:nameStrArr];
[arrM removeObjectAtIndex:0];
NSLog(@"%@",arrM);
[arrM removeLastObject];
NSLog(@"%@",arrM);
下面看輸出結果
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
)
創建指定大小的數組
下面我們就看一下創建指定大小的數組,先看oc
NSMutableArray *arrM = [NSMutableArray arrayWithCapacity:5];
[arrM addObject:@"Lilei"];
NSLog(@"%@",arrM);
下面看輸出結果
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)
下面看輸出結果
[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. 數組的遍歷
數組的遍歷總是工程中需要的邏輯處理,通過遍歷,在數組中找到我們感興趣的數據。數組的遍歷用兩種方法:
-
for - in
遍歷,這個如果對索引不感興趣可以使用 -
enumerated
函數,返回索引和對應數組值
先看一下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)")
}
下面看輸出結果
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);
}];
下面看輸出結果
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
后記
未完,待續~~~~