swift簡單總結(二)—— 簡單值和控制流

版本記錄

版本號 時間
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中是類似的,用ifswift進行條件判斷,使用for - inforwhiledo-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

由上可知,二者的繁瑣程度差不多。

后記

未完,待續~~~~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容