首页 >Swift

可失败构造器(Failable Initializers)

2014-10-22 11:27 编辑: suiling 分类:Swift 来源:DevTalking

Xcode6.1中Swift的最新版本是1.1,在该版本中引入了一个新的特性:可失败构造器。通过构造器初始化实际上是给class或struct的每一个存储属性(参数)提供初始值,进行对象实例化的过程。在一些情况下,初始化的过程是有可能失败的。比如,实例化一个对象,在实例化的过程中需要访问资源文件,就像从文件中加载图片一样:

  1. NSImage(contentsOfFile: "swift.png"

如果该文件不存在或者因为某种原因不允许访问,那么NSImage的初始化过程就会失败。在Swift 1.1版本中,像这种情况可以通过可失败构造器进行捕获。如果在构造一个对象时使用可失败构造器,那么当对象构造成功时返回该对象,当对象构造失败时则返回nil。因此可以直接用条件判断语句使用可失败构造器来实例化对象:

  1. if let image = NSImage(contentsOfFile: "swift.png") { 
  2.     // loaded the image successfully 
  3. else { 
  4.     // could not load the image 

init初始化方法可以通过在init关键字后面加上?或!将其变为可失败初始化方法,这样就表示某对象的初始化方法会产生两种结果。比如,将Int类型的init初始化方法变为可失败初始化方法,然后执行String类型转换:

  1. extension Int { 
  2.     init?(fromString: String) {  
  3.         if let i = fromString.toInt() { 
  4.             // Initialize 
  5.             self = i 
  6.         } else {  
  7.             // return nil, discarding self is implied 
  8.             return nil 
  9.         } 
  10.     } 

在可失败构造器或可失败初始化方法中,一旦返回nil就代表构造失败或初始化失败,不会再返回其他的值。在上述的示例中,当String不能解析为Integer时会导致初始化失败,返回nil,否则返回解析成功后的值。

可失败构造器/初始化方法解决了以前在Swift中只能通过工厂方法捕获构造或初始化失败情况的问题。比如,一个枚举,通过fromRaw工厂方法通过一个原始值来寻找它所对应的枚举成员,返回类型为可选枚举类型。即如果该原始值对应的枚举成员存在,那么返回该枚举成员,如果不存在则返回nil。现在,Swift编译器结合可失败构造器,通过可失败的初始化方法用switch语句判断原始值对应的枚举成员,如果没有对应的则返回nil:

  1. enum Color : Int { 
  2.     case Red = 0, Green = 1, Blue = 2 
  3.  
  4.     // implicitly synthesized 
  5.     var rawValue: Int { /* returns raw value for current case */ } 
  6.  
  7.     // implicitly synthesized 
  8.     init?(rawValue: Int) { 
  9.         switch rawValue {  
  10.             case 0: self = .Red 
  11.             case 1: self = .Green 
  12.             case 2: self = .Blue 
  13.             defaultreturn nil 
  14.         } 
  15.     } 

使用可失败构造器可极大程度的统一Swift中的构造对象语法,消除了构造器与工厂方法之间混乱、重复的冗余语法,使Swift更加简洁。随着可失败构造器这一特性的加入,Swift将对大多数Cocoa中带NSError参数的工厂初始化方法进行调整,从而加强Swift中构造对象语法的统一性,给开发者带来更好的开发体验。

你可以在The Swift Programming Language中查看更多关于可失败构造器的内容。

搜索CocoaChina微信公众号:CocoaChina
微信扫一扫
订阅每日移动开发及APP推广热点资讯
公众号:
CocoaChina
我要投稿   收藏文章
上一篇:Swift如何检查系统版本
下一篇:我在开发第一个Swift App过程中学到的四件事
我来说两句
发表评论
您还没有登录!请登录注册
所有评论(0

综合评论

相关帖子

sina weixin mail 回到顶部