霎时,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初探

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图