swift2.0语言新特性

更多文章关注小编的博客www.goofyy.com/bolg/ 传送门: goofyy技术宅

7B689CB2B802DEF50CD97573E006ED79

swift语言是苹果公司在2014年WWDC开发者大会上推出的新的开发语言,时至一年,swift经历了几番变更,在2015年的新过去的开发者的会上,苹果推出swift正式版2.0.并在2015年年底开放源代码,不得不说,这是一件很碉碉的事,其实swift开源的意义对于开发者来讲,主要是可以在更多地平台上面使用swift开发语言开发应用,不得不说,苹果公司也是放了一个大招。

小编也斗胆把自己当做swift语言的一个爱好者。小编几个月的学习当中,不得不说,swift开发语言让小编感受到的是痛快淋漓。不扯淡,下面讲一下swift2.0相对于swift1.2版本所做的更新。


1.错误处理   Error Handing


swift2.0引入了新的错误处理机制,说是新的,其实在其它的语言当中,已经相对成熟了,cathch throw try 等关键词,在java,python等语言里,早已经形成了比较成熟的的错误处理机制,swift在2.0之前并没有引入类似java的错误处理,而是采用了NSError错误处理。之前在论坛也有看到一篇文章关于swift语言错误处理,不过swift也算是尽心尽意,在swift2.0中就加入新的错误处理。废话不多说。讲一下新的错误处理



swift2.0引入的新的 ErrorType协议 ,产生得错误要进行throw要遵守ErrorType协议,才可以对错误进行throw,这里我们用一个枚举类型,列举一个产生错误的原因

enum errorPlayGame:ErrorType {
    case noMoney
    case noTime
    case noFriendToGether
}
这里的枚举类型errorPlayGame遵守ErrorType协议,这样子产生的错误才可以正常throw


举个简答的例子吧。我想和朋友去打游戏,但是不知道在那一天有没有时间,钱或者有没有人陪。那么我们编写程序如下


//定义枚举类型errorGame遵守ErrorType协议
enum errorGame:ErrorType {
    case noMoney
    case noTime
    case noFriendToGether
}

let money = 0
let time = 23
let numOfMyFriend = 2

//定义一个去打游戏的方法
func PlayGame() throws {
    guard money > 0  else {
        throw errorGame.noMoney
    }
    guard time > 0 else {
        throw errorGame.noTime
    }
    guard numOfMyFriend > 0 else {
        throw errorGame.noFriendToGether
    }
}
//定义一个开始去游戏方法,调用PlayGame。catch异常。
func startGame() {
    do {
        try PlayGame()
        print("starting Game")
    }
    catch errorGame.noMoney {
        print("no money")
        
    }
    catch errorGame.noTime {
        print("no Time")
    }
    catch errorGame.noFriendToGether {
        print("no friend play Game with me")
    }
    catch {
        
    }
}

startGame()
这里的 money 小于 0,所以程序会抛出异常, 程序的思路比较容易理解,讲一下注意的几点,startGame方法中,do {  }要做的就是开始执行里面程序,try抓取异常,如果执行成功,那么打印出 "starting Game"。cathch 完枚举的三个错误以后,要把catch关闭,即最后加入一个空的catch,否则则会报错 Error throw from are not handled because the enclosing catch is not exhaustive  意思就是catch没有关闭。


在PlayGame方法中有这样一个关键词 guard。这个其实简单明了的来说,其实gaurd的作用就是一个门卫的作用,简单举个例子


guard numOfMyFriend > 0 else {
        throw errorGame.noFriendToGether
    }
只有numOfMyFriend >0 的时候,才可以执行下面的程序。否则(else)就抛出一个异常。类似看门大叔说,有牌吗?有牌才能进大门。



2.绑定 Binding



guard let pants = pants, frog = frog else {
  // sorry, no frog pants here :[
  return
}
 
// at this point, frog and pants are both unwrapped and bound!


gaurd这个新的语法允许你在一个代码周期中构建一个提前的退出点。这样子可以让代码更为清晰


3.协议拓展  Protocol Extensions

协议拓展不得不说是良心之作啊。协议拓展是在新的swift2.0里才加入的,之前的拓展,主要是对已有的class , struct 和枚举类型,对它的方法进行拓展,新的swift语法可以对协议进行拓展。举个例子。



protocol 速度 {
    func 百公里加速时间() -> Double
}
struct  凯迪拉克:速度{
    var 价格:Int
    func 百公里加速时间() -> Double {
        return 1.5
    }
}

let 凯迪拉克1 = 凯迪拉克(价格: 20000000)
凯迪拉克1.百公里加速时间()
//此时我想获取卡迪拉克的排名,例如1.5就排名 1.5 * 100
extension 速度{
    var 排名:Int {
        get {
            return Int(百公里加速时间() * 100)
        }
    }
}
凯迪拉克1.排名


这里对协议拓展增加排名的功能,

凯迪拉克1.排名  输出排名  


4.有效性检查


这个主要是为了兼容一些老的ios版本。主要作用是可以检验一些新的API是否在一些老版本适用,包括OS X,IOS, Watch OS的软件开发


if #available(iOS 8.0, OSX 10.10, *) {
 // 当版本匹配时使用Handoff APIs.
 let activity =
 NSUserActivity(activityType:"com.example.ShoppingList.view")
 activity.becomeCurrent()
} else {
 print("此API不可用")
} 


5. do ...while循环更名 

do .. while循环更改成repeat .. while循环,主要是也是为了跟之前错误处理的do区别开来,也是更加直观,


var j = 1
repeat {
 j++
print(j)
}while(j <= 10)
更多文章关注goofyy的网站 。