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

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中构造对象语法的统一性,给开发者带来更好的开发体验。

原文地址:Failable Initializers

可失败构造器(Failable Initializers)的更多相关文章

  1. Swift 版本历史记录(关注)

    http://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/chapter1/03_revision_history.ht ...

  2. Swift Enum 枚举

    前言 枚举是一种自定义的数据类型,在 Swift 中枚举类型拥有相当高的自由度.在 Swift 语言中枚举是一级类型,它拥有在其他语言中只有类才拥有的一些特性,比如实例方法,实例构造器等. 枚举声明的 ...

  3. Swift 了解(2)

    循环(Loops) 1. For条件递增语句 ; counter < ; counter++ ) { liftWeights( ) } 语法是这样的:用for作为循环的开始,告诉Xcode你要声 ...

  4. Swift 中枚举

    Swift 中枚举高级用法及实践 字数11017 阅读479 评论0 喜欢20 title: "Swift 中枚举高级用法及实践"date: 2015-11-20tags: [AP ...

  5. Swift中可能失败的构造器的传播(调用)和重写

    import Foundation /* 可能失败构造器的传播(调用) 1.可能失败的构造器可以调用同一个类中的普通构造器 2.普通构造器不能调用同一个类中的可能失败构造器 3.结构体中, 普通构造器 ...

  6. Swift3.0P1 语法指南——构造器

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...

  7. 学习Swift -- 构造器(下)

    构造器(下) 可失败的构造器 如果一个类,结构体或枚举类型的对象,在构造自身的过程中有可能失败,则为其定义一个可失败构造器,是非常有必要的.这里所指的“失败”是指,如给构造器传入无效的参数值,或缺少某 ...

  8. 学习Swift -- 构造器(上)

    构造器(上) 构造过程是为了使用某个类.结构体或枚举类型的实例而进行的准备过程.这个过程包含了为实例中的每个存储型属性设置初始值和为其执行必要的准备和初始化任务. 构造过程是通过定义构造器(Initi ...

  9. swift3.0 构造器、析构方法(3)

    构造和析构是两种特殊的方法,在对象进行初始化的时候 使用构造,在对象的释放操作中,使用析构. 构造器的定义: init (){ //代码 } init(name:String){ //代码 } 在构造 ...

随机推荐

  1. Multi-touch.

    TP(Multi-touch). 1.Win7有6个版本,分别如下. Windows 7 Starter (初级版)                                        不支 ...

  2. 【反射】Reflect 介绍 示例

    介绍 JAVA反射机制是指:在运行状态中,对于任意一个[类],都能够知道这个类的所有属性和方法:对于任意一个[对象],都能够调用它的所有属性和方法:这种[动态]获取类中的信息以及动态调用对象的成员的功 ...

  3. linux 各种发行版及包管理器的关系

    linux 各种发行版及包管理器的关系 Linux发行版列表 基于Kpkg(Debian 系) Debian GNU / Linux 及其派生发行版使用deb软件包格式,并使用dpkg及其前端作为包管 ...

  4. innodb部分参数优化

    参数调优内容:1. 内存利用方面2. 日值控制方面3. 文件IO分配,空间占用方面4. 其它相关参数 1.内存利用方面:首先介绍一个Innodb最重要的参数:innodb_buffer_pool_si ...

  5. java下udp的DatagramSocket 发送与接收

    发送 package cn.stat.p4.ipdemo; import java.io.BufferedReader; import java.io.IOException; import java ...

  6. C#摇奖程序

    private void Form1_Load(object sender, EventArgs e) { //取消跨线层访问控件的判断 Control.CheckForIllegalCrossThr ...

  7. ISO3834认证所需的部分标准

    SO9606-1 焊工考试——熔化焊——第一部分:钢 ISO9606-2 焊工考试——熔化焊——第二部分:铝及铝合金 ISO14732 焊接人员——金属材料全机械化及自动化焊接的熔化焊操作攻击电阻焊安 ...

  8. 解决SurfaceView设置透明造成覆盖其他组件的替代方案

    之前在项目里面绘制摇杆圆盘使用SurfaceView来实现,同时设置SurfaceView透明,但是这样会造成SurfaceView的组件会覆盖其他的组件,一般情况没有关系,而不一般的情况就是有类似上 ...

  9. MongoDB 介绍及Windows下安装

    一.MongoDB简介 MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.它在许多场景下可用于替代传统的关系型数据库或键/值存储方式.Mongo使用C++ ...

  10. 近期Responsive web design项目经验分享

    关于meta   <meta name="viewport" content="initial-scale=1.0, minimum-scale=1.0, user ...