Xcode6.1中Swift的最新版本是1.1,在该版本中引入了一个新的特性:可失败构造器。通过构造器初始化实际上是给class
或struct
的每一个存储属性(参数)提供初始值,进行对象实例化的过程。在一些情况下,初始化的过程是有可能失败的。比如,实例化一个对象,在实例化的过程中需要访问资源文件,就像从文件中加载图片一样:
NSImage(contentsOfFile: "swift.png") |
如果该文件不存在或者因为某种原因不允许访问,那么NSImage
的初始化过程就会失败。在Swift 1.1版本中,像这种情况可以通过可失败构造器进行捕获。如果在构造一个对象时使用可失败构造器,那么当对象构造成功时返回该对象,当对象构造失败时则返回nil
。因此可以直接用条件判断语句使用可失败构造器来实例化对象:
if let image = NSImage(contentsOfFile: "swift.png") { // loaded the image successfully} else { // could not load the image} |
init
初始化方法可以通过在init
关键字后面加上?
或!
将其变为可失败初始化方法,这样就表示某对象的初始化方法会产生两种结果。比如,将Int
类型的init
初始化方法变为可失败初始化方法,然后执行String
类型转换:
extension Int { init?(fromString: String) { if let i = fromString.toInt() { // Initialize self = i } else { // return nil, discarding self is implied return nil } }} |
在可失败构造器或可失败初始化方法中,一旦返回nil
就代表构造失败或初始化失败,不会再返回其他的值。在上述的示例中,当String
不能解析为Integer
时会导致初始化失败,返回nil
,否则返回解析成功后的值。
可失败构造器/初始化方法解决了以前在Swift中只能通过工厂方法捕获构造或初始化失败情况的问题。比如,一个枚举,通过fromRaw
工厂方法通过一个原始值来寻找它所对应的枚举成员,返回类型为可选枚举类型。即如果该原始值对应的枚举成员存在,那么返回该枚举成员,如果不存在则返回nil
。现在,Swift编译器结合可失败构造器,通过可失败的初始化方法用switch
语句判断原始值对应的枚举成员,如果没有对应的则返回nil
:
enum Color : Int { case Red = 0, Green = 1, Blue = 2 // implicitly synthesized var rawValue: Int { /* returns raw value for current case */ } // implicitly synthesized init?(rawValue: Int) { switch rawValue { case 0: self = .Red case 1: self = .Green case 2: self = .Blue default: return nil } }} |
使用可失败构造器可极大程度的统一Swift中的构造对象语法,消除了构造器与工厂方法之间混乱、重复的冗余语法,使Swift更加简洁。随着可失败构造器这一特性的加入,Swift将对大多数Cocoa中带NSError
参数的工厂初始化方法进行调整,从而加强Swift中构造对象语法的统一性,给开发者带来更好的开发体验。