可失败构造器(Failable Initializers)
Xcode6.1中Swift的最新版本是1.1,在该版本中引入了一个新的特性:可失败构造器。通过构造器初始化实际上是给class
或struct
的每一个存储属性(参数)提供初始值,进行对象实例化的过程。在一些情况下,初始化的过程是有可能失败的。比如,实例化一个对象,在实例化的过程中需要访问资源文件,就像从文件中加载图片一样:
NSImage(contentsOfFile: "swift.png") |
如果该文件不存在或者因为某种原因不允许访问,那么NSImage
的初始化过程就会失败。在Swift 1.1版本中,像这种情况可以通过可失败构造器进行捕获。如果在构造一个对象时使用可失败构造器,那么当对象构造成功时返回该对象,当对象构造失败时则返回nil
。因此可以直接用条件判断语句使用可失败构造器来实例化对象:
if let image = NSImage(contentsOfFile: "swift.png") { |
init
初始化方法可以通过在init
关键字后面加上?
或!
将其变为可失败初始化方法,这样就表示某对象的初始化方法会产生两种结果。比如,将Int
类型的init
初始化方法变为可失败初始化方法,然后执行String
类型转换:
extension Int { |
在可失败构造器或可失败初始化方法中,一旦返回nil
就代表构造失败或初始化失败,不会再返回其他的值。在上述的示例中,当String
不能解析为Integer
时会导致初始化失败,返回nil
,否则返回解析成功后的值。
可失败构造器/初始化方法解决了以前在Swift中只能通过工厂方法捕获构造或初始化失败情况的问题。比如,一个枚举,通过fromRaw
工厂方法通过一个原始值来寻找它所对应的枚举成员,返回类型为可选枚举类型。即如果该原始值对应的枚举成员存在,那么返回该枚举成员,如果不存在则返回nil
。现在,Swift编译器结合可失败构造器,通过可失败的初始化方法用switch
语句判断原始值对应的枚举成员,如果没有对应的则返回nil
:
enum Color : Int { |
使用可失败构造器可极大程度的统一Swift中的构造对象语法,消除了构造器与工厂方法之间混乱、重复的冗余语法,使Swift更加简洁。随着可失败构造器这一特性的加入,Swift将对大多数Cocoa中带NSError
参数的工厂初始化方法进行调整,从而加强Swift中构造对象语法的统一性,给开发者带来更好的开发体验。
可失败构造器(Failable Initializers)的更多相关文章
- Swift 版本历史记录(关注)
http://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/chapter1/03_revision_history.ht ...
- Swift Enum 枚举
前言 枚举是一种自定义的数据类型,在 Swift 中枚举类型拥有相当高的自由度.在 Swift 语言中枚举是一级类型,它拥有在其他语言中只有类才拥有的一些特性,比如实例方法,实例构造器等. 枚举声明的 ...
- Swift 了解(2)
循环(Loops) 1. For条件递增语句 ; counter < ; counter++ ) { liftWeights( ) } 语法是这样的:用for作为循环的开始,告诉Xcode你要声 ...
- Swift 中枚举
Swift 中枚举高级用法及实践 字数11017 阅读479 评论0 喜欢20 title: "Swift 中枚举高级用法及实践"date: 2015-11-20tags: [AP ...
- Swift中可能失败的构造器的传播(调用)和重写
import Foundation /* 可能失败构造器的传播(调用) 1.可能失败的构造器可以调用同一个类中的普通构造器 2.普通构造器不能调用同一个类中的可能失败构造器 3.结构体中, 普通构造器 ...
- Swift3.0P1 语法指南——构造器
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- 学习Swift -- 构造器(下)
构造器(下) 可失败的构造器 如果一个类,结构体或枚举类型的对象,在构造自身的过程中有可能失败,则为其定义一个可失败构造器,是非常有必要的.这里所指的“失败”是指,如给构造器传入无效的参数值,或缺少某 ...
- 学习Swift -- 构造器(上)
构造器(上) 构造过程是为了使用某个类.结构体或枚举类型的实例而进行的准备过程.这个过程包含了为实例中的每个存储型属性设置初始值和为其执行必要的准备和初始化任务. 构造过程是通过定义构造器(Initi ...
- swift3.0 构造器、析构方法(3)
构造和析构是两种特殊的方法,在对象进行初始化的时候 使用构造,在对象的释放操作中,使用析构. 构造器的定义: init (){ //代码 } init(name:String){ //代码 } 在构造 ...
随机推荐
- 论js闭包的重要性
很久没写博客了,今天发现了一个很有意思的问题,写下来分享一下 话不多说,贴前端代码: <script type="text/javascript" src="js/ ...
- Android 自定义控件玩转字体变色 打造炫酷ViewPager指示器
1.概述 本篇博客的产生呢,是因为,群里的哥们暖暖给我发了个效果图,然后问我该如何实现顶部ViewPager指示器的字体变色,该效果图是这样的: 大概是今天头条的app,神奇的地方就在于,切换View ...
- 读取xml文件信息
static void Main(string[] args) { XmlTextReader reader = new XmlTextReader(@"D:\zy\visual studi ...
- django: form fileupload - 2
继续介绍文件上传的第二种形式和第三种形式. ------------------------------------------------------------- 第二种形式较简单,直接用 DB ...
- Java多线程练习
国际惯例,先贴出代码 package jiankong; import java.util.Date; public class jiankong { public static void main( ...
- 2:url有规律的多页面爬取
举例网站:http://www.luoo.net/music/期刊号 e.g:http://www.luoo.net/music/760 打算爬取其title:Hello World:pic:desc ...
- MYSQL触发器的NEW和OLD的一个小问题
OLD NEW 对于没有插入的字段,OLD和NEW的值都等于原来的记录
- DataTable循环删除行
1.如果只是想删除datatable中的一行,可以用DataRow的delete,但是必须要删除后让DataTable知道,所以就要用 到.AcceptChanges()方法,原因是这种删除只是标识性 ...
- java线层的使用
class Do3 { public static void main(String[] args) { XC d1=new XC("小王"); XC d2=new XC(&quo ...
- sass基础学习
2015.6.281.安装ruby2.运行gem安装sass-->gem install sass3.编译命令行sass --watch 文件路径/test.scss:编译后文件路径/test. ...