版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2017.07.17 |
前言
我是swift2.0的時候開始接觸的,記得那時候還不是很穩定,公司的項目也都是用oc做的,并不對swift很重視,我自己學了一段時間,到現在swift3.0+已經出來了,自己平時也不寫,忘記的也差不多了,正好項目這段時間已經上線了,不是很忙,我就可以每天總結一點了,希望對自己對大家有所幫助。在總結的時候我會對比oc進行說明,有代碼的我會給出相關比對代碼。
1. swift簡單總結(一)—— 數據簡單值和類型轉換
簡單值
下面我們繼續說一下簡單值,這里說一下簡單值中的字典和數組。
字典和數組
我們先看一下oc中數組和字典的定義。
NSArray *arr = @[@"ass" ,@"ssd" ,@"333"];
NSDictionary *dict = @{@"key1":@"value1",
@"key2":@"value2"};
swift中的數組和字典怎么定義呢,我們繼續往下看。使用方括號[]來創建數組和字典,并使用小標或者鍵來訪問元素。
var shoppingArr = ["bread", "beer", "sugar"]
shoppingArr[0] = "water"
print(shoppingArr)
下面看輸出結果。
["water", "beer", "sugar"]
接著我們看一下swift中字典如何定義的。
var dict = ["key1":"value1","key2":"value2"]
dict["key1"] = "value3"
print(dict)
下面我們看輸出結果
["key2": "value2", "key1": "value3"]
空數組和空字典
我們先看一下oc中空數組和空字典。
NSMutableArray *emptyArr = [NSMutableArray array];
NSMutableDictionary *emptyDict = [NSMutableDictionary dictionary];
下面我們在看一下swift中空字典和空數組是如何定義的。
let emptyArr = [String]()
let emptyDict = [String : Float]()
如果類型可以被推斷出來,可以用[]
和[:]
來創建空的數組和字典,就像聲明變量或者給函數傳參數的時候一樣。
emptyArr = []
emptyDict = [:]
控制流
1.簡單的控制流
swift中的控制流和oc中是類似的,用if
和swift
進行條件判斷,使用for - in
、for
、while
、do-while
來進行循環,包裹條件和循環變量括號可以省略,但是語句體的大括號是必須的。下面我們就看一下例子。
let studentScore = [100, 200, 120 ,232]
var aveScore = 0
for score in studentScore {
if score >= 200 {
aveScore += 10
}
else {
aveScore += 0
}
}
print(aveScore)
下面我們就用oc的代碼改造一下,看一下oc代碼時怎樣的。
NSArray *studentScore = @[@100, @200, @120, @232];
NSInteger aveScore = 0;
for (NSNumber *score in studentScore) {
if (score.integerValue >= 200) {
aveScore += 10;
}
else {
aveScore += 0;
}
}
NSLog(@"%ld", aveScore);
下面看一下輸出結果。
2017-07-17 23:29:01.118 JJOC[2855:230896] 20
還有一點swift和oc不同的是,swift中if
后面必須是bool表達式,像if score{ }
這么寫會報錯的,而不會隱形的與0作比較,下面我們直接看代碼。
var score = 10
if score {
score += 1
}
print(score)
這么寫就會報錯,錯誤信息是:
"Int" is convertible to "Bool"
但是在oc中這么判斷就是可以的,看代碼。
NSInteger score = 100;
if (score) {
score += 1;
}
NSLog(@"%ld", score);
下面看輸出結果
2017-07-17 23:32:28.018 JJOC[2915:236963] 101
2.if let使用處理可選類型
你可以使用if let
來處理值缺失的情況,有些值是可選的,可以為nil
,也可以為確定值,當為nil
值時就表示值缺失,在類型后面加一個問號來標記這個變量的值是可選的。對于這種值缺失的情況我們可以使用if let
來處理。
下面看代碼。
var optionalName : String? = "John Brown"
var greet = "hello!"
if let name = optionalName {
greet = "Hello, \(name)"
}
print(greet)
下面看輸出結果。
Hello, John Brown
這個是怎么工作的呢?如果變量的可選值為nil
,條件會判斷為false
,大括號中的代碼會跳過,如果不是nil
,會將值賦給let
后面的常量,這樣代碼快中就可以使用這個值了。
3.switch的使用
swift中也有switch,與oc中switch
不同的是,oc中的switch
只能比較的是整形,比如枚舉值(也是整形)。但是swift中switch
支持任意類型的比較,比如字符串,這個是oc中所沒有的功能,總結下來。
- oc中只可以比較整形,swift中可以比較任意類型。
- oc中有穿透效果,swift中沒有穿透效果,不用break,匹配到了就直接跳出,沒有匹配到就走default。
下面我們還是看代碼。
let vegetable = "red pepper"
switch vegetable {
case "celery":
let comment = "celery";
print(comment)
case "cucumber", "watercress":
let comment = "cucumber, watercress";
print(comment)
case let x where x.hasSuffix("pepper"):
let comment = "It is a \(x)";
print(comment)
default:
let comment = "nothing";
print(comment)
}
看輸出結果
It is a red pepper
可見,swift更加的靈活多變,oc相對就比較死板,但是靈活帶來的壞處就是容易出錯,多寫寫也就好了。
4. for - in遍歷字典
字典作為集合對象,與數組一樣都是可以遍歷的,下面我們就看一下利用for - in
來遍歷字典的情況。
首先我們看一下oc
中,遍歷字典。
NSInteger __block largestNumber;
NSDictionary *numberDict = @{@"Prime" : @[@2, @3, @5, @7, @11, @13],
@"Fibonacci" : @[@1, @1, @2, @3, @5, @8],
@"Square" : @[@1, @4, @9, @16, @25],
};
[numberDict enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSArray *obj, BOOL * _Nonnull stop) {
[obj enumerateObjectsUsingBlock:^(NSNumber *obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj integerValue] > largestNumber) {
largestNumber = [obj integerValue];
}
}];
}];
NSLog(@"%ld",largestNumber);
下面我們看輸出結果。
25
然后我們看一下swift
中對字典的遍歷。
let numberDict = ["Prime" : [2, 3, 5, 7, 11, 13],
"Fibonacci" : [1, 1, 2, 3, 5, 8],
"Square" : [1, 4, 9, 16, 25],
]
var largestNumber = 0
for (key , numbers) in numberDict {
for number in numbers {
if number > largestNumber {
largestNumber = number
}
}
}
print(largestNumber)
下面看輸出結果
25
由上可知,二者的繁瑣程度差不多。
后記
未完,待續~~~~