葡京娱乐棋牌官网Swift 2.0新探

转瞬,Swift已经同载大抵矣,这门新鲜、语法时尚、类型安全、执行进度还快之言语都日趋的刻骨铭心广泛开发者的心田。我同一也是深喜爱这宗新的编程语言。

当年6月,一年一度的WWDC大会如期而至,在大会上Apple发布了Swift
2.0,引入了累累初的特征,以援手开发者能够重快,更简短的构建以。我于此间吧说道说道Swift
2.0吃值得大家留意的初特色。

guard语句

guard语句和if话有点类似,都是冲其关键字后的表达式的布尔值决定下一致步执行什么。但跟if言语不同的凡,guard告知句子只会产生一个代码块,不像if说话可以if else大多个代码块。

那么guard话语的来意到底是什么啊?顾名思义,就是守护。guard言判断其后的表达式布尔值为false经常,才见面实行下代码块里之代码,如果为true,则超越了尽guard说话,我们举例来探。

我们因为今年高考为条例,在进入考场时一般都见面检查身份证跟准考证,我们描绘这样一个计:

func checkup(person: [String: String!]) {

    // 检查身份证,如果身份证没带,则不能进入考场
    guard let id = person["id"] else {
        print("没有身份证,不能进入考场!")
        return
    }

    // 检查准考证,如果准考证没带,则不能进入考场
    guard let examNumber = person["examNumber"] else {
        print("没有准考证,不能进入考场!")
        return
    }

    // 身份证和准考证齐全,方可进入考场
    print("您的身份证号为:\(id),准考证号为:\(examNumber)。请进入考场!")

}

checkup(["id": "123456"]) // 没有准考证,不能进入考场!
checkup(["examNumber": "654321"]) // 没有身份证,不能进入考场!
checkup(["id": "123456", "examNumber": "654321"]) // 您的身份证号为:123456,准考证号为:654321。请进入考场!

上述代码中之率先独guard言辞用于检查身份证,如果检查到身份证无带,也就是是表达式为false时,执行大括号里的代码,并回到。第二个guard报句则检查遵循考证。

假如简单认证齐全,则实施最后一个打印语句,上面的有限个guard晓句大括哀号内之代码都非见面履,因为他俩表达式的布尔值都是true

此值得注意的是,idexamNumber可以在guard话之外使用,也就是说当guard对那表达式进行求证后,idexamNumber可是每当任何艺术的作用域中使,并且是解包后底。

咱俩再度就此if else语词写一个看似之法子:

func checkupUseIf(person: [String: String!]) {

    if let id = person["id"], let examNumber = person["examNumber"] {
        print("您的身份证号为:\(id),准考证号为:\(examNumber)。请进入考场!")
    } else {
        print("证件不齐全,不能进入考场!")
    }

    print("您的身份证号为:\(id),准考证号为:\(examNumber)")

}

checkupUseIf(["id": "123456"]) // 证件不齐全,不能进入考场!
checkupUseIf(["examNumber": "654321"]) // 证件不齐全,不能进入考场!
checkupUseIf(["id": "123456", "examNumber": "654321"]) // 您的身份证号为:123456,准考证号为:654321。请进入考场!

咱得以视用if else贯彻的办法肯定不如guard落实之那精准。而且idexamNumber的作用域只限在if的第一个大括号内,超出这个作用域编译就会见报错。

经上述两独稍例子不难看出,guard说话正如一个称职的防御,层层把关,严防一切非容许有的从事,并且被代码有更胜之可读性,非常棒。

死处理

在Swift
1.0时是从未大处理同抛出机制的,如果一旦拍卖好,要么以if else语句或switch说话判断处理,要么下闭包形式之回调函数处理,再或者就利用NSError处理。以上这些艺术都未克如Java中的try catch可怜控制语句那样行要流水、从容不迫的处理好,而且也会见骤降代码的可读性。当Swift
2.0来临后,一切都非雷同了。

以Swift
2.0遭到Apple提供了采取throwsthrowtrydocatch即五只主要字组合的挺控制处理体制。下面我们来比喻看看如何行使,我之所以利用手机刷朋友围也例。

第一我们用定义格外枚举,在Swift
2.0被Apple提供了ErrorType商讨需我们从定义之雅枚举遵循:

enum WechatError: ErrorType {
    case NoBattery // 手机没电
    case NoNetwork // 手机没网
    case NoDataStream // 手机没有流量
}

我们定义了致不克刷微信的错误枚举’wechatError。然后定义一个检查是不是可以刷微信的不二法门checkIsWechatOk()

func checkIsWechatOk(isPhoneHasBattery: Bool, isPhoneHasNetwork: Bool, dataStream: Int) throws {

    guard isPhoneHasBattery else {
        throw WechatError.NoBattery
    }

    guard isPhoneHasNetwork else {
        throw WechatError.NoNetwork
    }

    guard dataStream > 50 else {
        throw WechatError.NoDataStream
    }

}

这边注意,在道名后有throws第一字,意思为该办法有的不可开交向上层抛出。在方式体内使用guard话语对各种状态进行判断,然后下throw要字抛来相应的特别。然后我们定义刷微信的章程:

func playWechat(isPhoneHasBattery: Bool, isPhoneHasNetwork: Bool, dataStream: Int) {

    do {
        try checkIsWechatOk(isPhoneHasBattery, isPhoneHasNetwork: isPhoneHasNetwork, dataStream: dataStream)
        print("放心刷,刷到天昏地暗!")
    } catch WechatError.NoBattery {
        print("手机都没电,刷个鬼啊!")
    } catch WechatError.NoNetwork {
        print("没有网络哎,洗洗玩单机吧!")
    } catch WechatError.NoDataStream {
        print("没有流量了,去蹭Wifi吧!")
    } catch {
        print("见鬼了!")
    }

}

playWechat(true, isPhoneHasNetwork: true, dataStream: 60) // 放心刷,刷到天昏地暗!
playWechat(true, isPhoneHasNetwork: false, dataStream: 60) // 没有网络哎,洗洗玩单机吧!
playWechat(false, isPhoneHasNetwork: true, dataStream: 60) // 手机都没电,刷个鬼啊!
playWechat(true, isPhoneHasNetwork: true, dataStream: 30) // 没有流量了,去蹭Wifi吧!

上述的代码示例中,首先检查是否可刷微信的道前使用try着重字,表示同意该方法抛来老,然后使了do catch操纵语句捕获抛来之要命,进而做连锁的逻辑处理。

眼看套好处理机制使Swift更加的一揽子和安全,并且增长了代码的可读性,非常棒。

协议扩展

在Swift 1.0
时代,协议(Protocol)基本上类似一个接口,定义若干属性与办法,供类、结构体、枚举遵循和落实。在Swift
2.0面临,可以针对商进行性或者措施的恢弘,和扩大类和结构体类似。这给咱们被了面向协议编程的篇章。

Swift中,大多数基础对象都按照了CustomStringConvertible协议,比如ArrayDictionary(Swift
1.0中的Printable磋商),该谋定义了description方法,用于print法打印对象。现在咱们本着拖欠谋扩展一个方式,让那个打印出大写的内容:

var arr = ["hello", "world"]
print(arr.description) // "[hello, world]"

extension CustomStringConvertible {
    var upperDescription: String {
        return "\(self.description.uppercaseString)"
    }
}

print(arr.upperDescription) // "[HELLO, WORLD]"

倘以Swfit
1.0期,要惦记达到上述示范的效益,那么我们需要各自对ArrayDictionary展开扩张,所以协议的恢弘极大的增长了俺们的编程葡京娱乐棋牌官网效率,也一致如果代码更简洁和易读。

打印语句之转移

在Swift1中,有’println()’和’print()’两独以控制台打印语句的点子,前者是换行打印,后者是连行打印。在Swift2中,’println()’已成过去,取而代之的是他们的结合体。如果你想做换行打印,现在欲这么形容:

print("我要换行!", appendNewline: true)

available检查

用作iOS开发者,谁都希望利用新型版本iOS的Api进行付出,省事省力。但时常从跟愿违,因为我们常索要适配老版的iOS,这就见面面临一个题目,一些新特征特性或有近乎无法以老版本的iOS中使,所以在编码过程被常常会对iOS的版做为判断,就像这样:

if NSClassFromString("NSURLQueryItem") != nil {
    // iOS 8或更高版本
} else{
    // iOS8之前的版本
}

上述这仅是均等栽方法,在Swift
2.0事先为并未一个正式的模式或机制帮助开发者判断iOS版本,而且爱出现疏漏。在Swift
2.0来临后,我们来矣专业的不二法门来开这个工作:

if #available(iOS 8, *) {
    // iOS 8或更高版本
    let queryItem = NSURLQueryItem()

} else {
    // iOS8之前的版本

}

本条特性深受我们最为幸福。

do-while话重命名

经典的do-while言改名了,改以repeat-while

var i = 0
repeat {
    i++
    print(i)
} while i < 10

个人感觉更加直观了。

defer关键字

以有些言语中,有try/finally然的操纵语句,比如Java。这种话语可以吃我们在finally代码块被执得要履的代码,不管之前怎样的扰民。在Swift
2.0遭到,Apple提供了defer根本字,让咱们得以兑现同的效益。

func checkSomething() {

    print("CheckPoint 1")
    doSomething()
    print("CheckPoint 4")

}

func doSomething() {

    print("CheckPoint 2")
    defer {
        print("Clean up here")
    }
    print("CheckPoint 3")

}

checkSomething() // CheckPoint 1, CheckPoint 2, CheckPoint 3, Clean up here, CheckPoint 4

上述示范可以见到,在打印出“CheckPoint 2”之后并没打印出“Clean up
here”,而是“CheckPoint
3”,这便是defer的来意,它对展开了print("Clean up here")推迟。我们又来拘禁一个I/O的言传身教:

// 伪代码
func writeSomething() {

    let file = OpenFile()

    let ioStatus = fetchIOStatus()
    guard ioStatus != "error" else {
        return
    }
    file.write()

    closeFile(file)

}

上述示范是一个I/O操作的伪代码,如果得到到的ioStatus例行,那么该措施无问题,如果ioStatus得到之是error,那么会受guard告诉句抓到实践return操作,这样的话closeFile(file)不怕永远都未会见尽了,一个重的Bug就这样发生了。下面我们省哪用defer来缓解此问题:

// 伪代码
func writeSomething() {

    let file = OpenFile()
    defer {
        closeFile(file)
    }

    let ioStatus = fetchIOStatus()
    guard ioStatus != "error" else {
        return
    }
    file.write()

}

我们将closeFile(file)放在defer代码块里,这样虽ioStatuserror,在执行return前会先实行defer里之代码,这样即便确保了无发生什么,最后都见面将文件关闭。

defer再者一个保证我们代码健壮性的特色,我充分爱。

Swift 2.0蒙的新特征当然不止上述这些,但窥一斑可见全豹,Swift
2.0尽力拿另行快、更安全形成极致,这是开发人员的教义,让咱尽情享用立宗美妙之言语吧。

正文首发地址:Swift
2.0初探

相关文章