可失败构造器(Failable Initializers)

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

时间: 2024-10-10 22:07:47

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

(二十六)swift可失败构造器

/* 如果一个类.结构体或枚举类型的对象,在构造自身的过程中有可能失败,则为其定义一个可失败构造器,是非 常有用的.这里所指的"失败"是指,如给构造器传入无效的参数值,或缺少某种所需的外部资源,又或是不满 足某种必要的条件等. 为了妥善处理这种构造过程中可能会失败的情况.你可以在一个类,结构体或是枚举类型的定义中,添加一个或多个可失败构造器.其语法为在 init 关键字后面加添问号 (init?) . 注意:可失败构造器的参数名和参数类型,不能与其它非可失败构造器的参数名,及其类型相同

Swift 版本历史记录(关注)

http://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/chapter1/03_revision_history.html 本页内容包括: XCode6.2 Beta3 Swift语法文档更新 XCode6.2 Beta2 Swift语法文档更新 XCode6.2 Beta1 Swift语法文档更新 XCode6.1.1 Swift语法文档更新 XCode6.1 Swift语法文档更新 XCode6.1 Beta2

Swift 中枚举

Swift 中枚举高级用法及实践 字数11017 阅读479 评论0 喜欢20 title: "Swift 中枚举高级用法及实践"date: 2015-11-20tags: [APPVENTURE]categories: [Swift 进阶]permalink: advanced-practical-enum-examples 原文链接=http://appventure.me/2015/10/17/advanced-practical-enum-examples/作者=Benedik

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

import Foundation /* 可能失败构造器的传播(调用) 1.可能失败的构造器可以调用同一个类中的普通构造器 2.普通构造器不能调用同一个类中的可能失败构造器 3.结构体中, 普通构造器却可以调用同一个结构体中可能失败的构造器 可能失败构造器的重写 1.子类可以用可能失败的构造器或者普通的构造器重写父类中的可能失败的构造器 2.子类的普通构造器不能向上调用父类的可能失败的构造器 3.子类的可能失败的构造器可以调用父类的可能失败的构造器 */ class Person { var n

学习Swift -- 构造器(下)

构造器(下) 可失败的构造器 如果一个类,结构体或枚举类型的对象,在构造自身的过程中有可能失败,则为其定义一个可失败构造器,是非常有必要的.这里所指的“失败”是指,如给构造器传入无效的参数值,或缺少某种所需的外部资源,又或是不满足某种必要的条件等. 为了妥善处理这种构造过程中可能会失败的情况.你可以在一个类,结构体或是枚举类型的定义中,添加一个或多个可失败构造器.其语法为在init关键字后面加添问号(init?). 可失败构造器,在构建对象的过程中,创建一个其自身类型为可选类型的对象.你通过re

学习Swift -- 构造器(上)

构造器(上) 构造过程是为了使用某个类.结构体或枚举类型的实例而进行的准备过程.这个过程包含了为实例中的每个存储型属性设置初始值和为其执行必要的准备和初始化任务. 构造过程是通过定义构造器(Initializers)来实现的,这些构造器可以看做是用来创建特定类型实例的特殊方法.与 Objective-C 中的构造器不同,Swift 的构造器无需返回值,它们的主要任务是保证新实例在第一次使用前完成正确的初始化. 类和结构体在实例创建时,必须为所有存储型属性设置合适的初始值.存储型属性的值不能处于一

汇集了很多swift 学习指南

https://github.com/ipader/SwiftGuide 1,059   Unstar7,294 Fork1,966 ipader/SwiftGuide CodeIssues 0Pull requests 0WikiPulseGraphs 这份指南汇集了Swift语言主流学习资源,并以开发者的视角整理编排.http://dev.swiftguide.cn 376 commits 3 branches 0 releases 12 contributors Swift 100.0%

进击的雨燕-------------枚举

枚举为一组相关的值定义了一个共同的类型,使你可以在你的代码中以类型安全的方式来使用这些值. 如果你熟悉 C 语言,你会知道在 C 语言中,枚举会为一组整型值分配相关联的名称.Swift 中的枚举更加灵活,不必给每一个枚举成员提供一个值.如果给枚举成员提供一个值(称为“原始”值),则该值的类型可以是字符串,字符,或是一个整型值或浮点数. 此外,枚举成员可以指定任意类型的关联值存储到枚举成员中,就像其他语言中的联合体(unions)和变体(variants).每一个枚举成员都可以有适当类型的关联值.

进击的雨燕------------构造过程

构造过程是使用类.结构体或枚举类型的实例之前的准备过程.在新实例可用前必须执行这个过程,具体操作包括设置实例中每个存储型属性的初始值和执行其他必须的设置或初始化工作. 通过定义构造器(Initializers)来实现构造过程,这些构造器可以看做是用来创建特定类型新实例的特殊方法.与 Objective-C 中的构造器不同,Swift 的构造器无需返回值,它们的主要任务是保证新实例在第一次使用前完成正确的初始化. 类的实例也可以通过定义析构器(deinitializer)在实例释放之前执行特定的清