使用Swift2.0隨筆(更新版)

1.我感覺Swift2.0最大改進(jìn)就是減少金字塔寫法(就是那種if里面再套一個(gè)if然后再套一個(gè)if很丑的代碼),對于Swift1.2中的很多optional都進(jìn)行確定值,使用guard和if let 可以減少一些那種金字塔的寫法。

1).使用guard

guard a > 10 else{ return }

2).使用傳統(tǒng)的if

if a > 10{  } 
2.對于什么時(shí)候使用guard什么時(shí)候使用if (statement == nil)什么時(shí)候使用if let 的一些個(gè)人理解:
if let mobil = teleField.text{}
//這里進(jìn)行不為空的操作
guard let mobilePhone = teleField.textelse{return}
//這里進(jìn)行不為空的操作

guard對于if let的優(yōu)勢是:不用在大括號(hào)里面進(jìn)行代碼的書寫,這樣就少了一層金字塔。因?yàn)間uard的語法里面,只有當(dāng)條件為假的時(shí)候才會(huì)去執(zhí)行大括號(hào)里面的內(nèi)容,否則執(zhí)行大括號(hào)以外的內(nèi)容。

if let 對于guard的優(yōu)勢在于:雖然guard可以將代碼寫在大括號(hào)以外,return和throw對于內(nèi)存消耗相對于來說是最頂級的,而且這樣看起來代碼很長的一串。

對于這些還是得看自己寫代碼的習(xí)慣,這只是記錄一下我的習(xí)慣而已

3.枚舉和錯(cuò)誤處理:

如果只是需要簡單的錯(cuò)誤處理,完全沒有把這個(gè)ErrorTypeEnum搞得這么復(fù)雜,我這么做的原因是可以很清楚地知道錯(cuò)誤類型,錯(cuò)誤的描述,以及把Domain也包含進(jìn)來,這樣可以便于管理

1).我定義了一個(gè)ErrorEnum來處理網(wǎng)絡(luò)請求可能出現(xiàn)的不同的情況

public enum NetWorkError:String{

case DATA_TYPE_ERROR    = "數(shù)據(jù)類型錯(cuò)誤!(Data type error)"

case STATUS_CODE_ERROR  = "狀態(tài)碼錯(cuò)誤!(Status code error)"

case MESSAGE_CODE_ERROR = "解析失敗時(shí)出現(xiàn)錯(cuò)誤!(Message code error)"

case DATA_CODE_ERROR    = "解析狀態(tài)數(shù)據(jù)時(shí)出現(xiàn)錯(cuò)誤!(Data code error)"

case REQUEST_CODE_ERROR = "請求錯(cuò)誤!(Request code error)"

static var Domain:String{
    return "DataErrorDomain"
}

var code:Int{
    switch self{
    case .DATA_TYPE_ERROR:
        return 10001
    case .STATUS_CODE_ERROR:
        return 10002
    case .MESSAGE_CODE_ERROR:
        return 10003
    case .DATA_CODE_ERROR:
        return 10004
    case .REQUEST_CODE_ERROR:
        return 10005
    }
}

var description:String{
    return self.rawValue
}
}

2).現(xiàn)在需要使用extension給NetworkError添加錯(cuò)誤處理,代碼如下:

extension NetWorkError:ErrorType{ }

3).使用ErrorType

這是一段我項(xiàng)目中的邏輯處理的函數(shù)

 private func filter_dataForThrows(results:AnyObject!)throws -> AnyObject?{
    guard let dataDic = results as? [String:AnyObject] else{
        throw NetWorkError.DATA_TYPE_ERROR
    }
    if let notice = dataDic["notice_message"] as? String{
        self.notice = notice
    }
    guard let status  = dataDic["code"] as? Int else{
        throw NetWorkError.STATUS_CODE_ERROR
    }
    switch status{
    case 0:
        if let cur_data   = dataDic["data"] {
            return cur_data
        }else{
            throw NetWorkError.DATA_CODE_ERROR
        }
    default:
        throw NetWorkError.MESSAGE_CODE_ERROR
    }
 }

4).捕獲錯(cuò)誤

我使用do catch來捕獲錯(cuò)誤

 do{
        let _ = try filter_dataForThrows(results)
 }catch let error{
        if let cur_error = error as? NetWorkError{ print(cur_error.description) }
 }

在這里我就可以很清楚的知道到底是哪里出了問題。
當(dāng)然你可以直接只使用do,而不使用catch來捕獲錯(cuò)誤。

do{
  let result = try? self.filter_dataForThrows(results)
}
4.發(fā)現(xiàn)一個(gè)關(guān)于函數(shù)的語法糖吧

1).先看看正常的函數(shù)的可變參數(shù)語法:

函數(shù)聲明:

func variablePar(students:String...){
    //這里students不能聲明為inout類型
    students.forEach{ print($0) }
}

函數(shù)調(diào)用:

variablePar("zhangsan","lisi","wanger")

2).我發(fā)現(xiàn)的語法糖

我發(fā)現(xiàn)這個(gè)是在自學(xué)python的時(shí)候里面的可變參數(shù)的書寫形式,然我嘗試在Swift中實(shí)現(xiàn),出乎我的意料還真的可以這么寫,可以給一個(gè)參數(shù)提供一個(gè)默認(rèn)值,從而達(dá)到不需要輸入這個(gè)參數(shù)的目的

函數(shù)聲明:

func defaultfunc(name:String,age:Int = 18){
    
}

函數(shù)調(diào)用:

defaultfunc("zhangsan")//第一種調(diào)用方法
defaultfunc("zhangsan", age: 19)//第二種調(diào)用方法

在python中,必選參數(shù)在前,默認(rèn)參數(shù)在后,否則Python的解釋器會(huì)報(bào)錯(cuò)(思考一下為什么默認(rèn)參數(shù)不能放在必選參數(shù)前面)報(bào)錯(cuò):SyntaxError: non-default argument follows default argument,但是這個(gè)約束在Swift中并不會(huì)出現(xiàn)

5.生成器Generator

對于Swift序列和生成器的介紹的文章,可以在初探 Swift Sequences 和 Generators查看,我闡述一下我在學(xué)習(xí)Python的生成器和Swift生成器理解上的異同。

1).Swift中的生成器和序列的關(guān)系

GeneratorType</code>和<code>SequenceType協(xié)議和文章初探 Swift Sequences 和 Generators來說一下我對他們的理解。
Generator類://這其實(shí)就是一個(gè)求斐波拉契數(shù)列(Fibonacci)的生成器

class FibonacciGenerator : GeneratorType {
    var last = (0,1)
    var endAt:Int
    var lastIteration = 0

    init(end:Int){
        endAt = end
    }

    func next() -> Int?{
      guard lastIteration<endAt else {
          return nil
      }
      lastIteration++
    
      let next = last.0
      last = (last.1,last.0+last.1)
      return next
  }
}

他有一個(gè)next()函數(shù)這是為了生成下一個(gè)元素,遍歷到最后他會(huì)生成nil。

Sequence類://記?。哼@是一個(gè)序列,就好像Array一樣,你可以通過Array()來轉(zhuǎn)變?yōu)锳rray類型

class FibonacciSequence : SequenceType {
  var endAt:Int

  init(end:Int){
      endAt = end
  }

  func generate() -> FibonacciGenerator{
      return FibonacciGenerator(end: endAt)
  }
}

其中的generate()函數(shù)就是生成上訴的生成器,然后你可以使用foreach,map,flatmap,reduce等等函數(shù),不是很好描述,粗暴的描述就是:你可以把他轉(zhuǎn)換為其他類型的序列。
就像是在該文章中所說真的沒有必要你沒用一次就自己去創(chuàng)建一個(gè)Generator類,你可以直接使用AnyGenerator<Element>,他同時(shí)遵循了GeneratorType和SequenceType協(xié)議,下面是apple文檔中的舉例:

 var x = 7
 let g = anyGenerator { x < 15 ? x++ : nil }
 let a = Array(g) // [ 7, 8, 9, 10, 11, 12, 13, 14 ]

生成了序列g(shù)然后通過g初始化了一個(gè)數(shù)組a。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容