- 说明:
- 文中提到的”构造器”和Object_C中的”初始化”类似.
- 博文中的代码仅为讲解知识, 没有成型的项目Demo.
- 资料链接Swift2.0(中文版)
- 举例: (构造过程–默认构造器) 代表前面的文字出自”构造过程”这章中的”默认构造器”小节.
- 建议看一看Swift2.0中的(基础部分– 可选, nil, if语句以及强制解析, 可选绑定, 隐私解析可选类型) 和 (构造过程–存储属性的初始赋值, 默认构造器, 类的继承和构造过程)
- 此文章由 @春雨 编写. 经 @Scott 审核. 若转载此文章,请注明出处和作者
代码
class ViewController: UIViewController {
var titleString: String /**< 这样写属性, 编译器会报错: Class 'ViewController' has no initializers. */
}
原因:
- 一个类的所有存储属性(包括从父类继承来的任何属性)必须在构造过程中设置初始值.(构造过程–类的继承和构造过程)
如果结构体或类的所有属性都有默认值,同时没有自定义的构造器,那么 Swift 会给这些结构体或类提供一个默认构造器(default initializers)。这个默认构造器将简单地创建一个所有属性值都设置为默认值的实例.(构造过程–默认构造器)
综上所述, 由于titleString属性没有默认值, ViewController这个类的默认构造器就不能在构造过程中为titleString设置初始值, 所以编译器报错.
解决方案:
- 方案一: 为属性设置默认值.
- 方案二: 将属性设置为可选类型.
- 方案三: 将属性设置为隐式解包可选类型.
方案一: 为属性设置默认值.
class ViewController: UIViewController {
// 为存储属性设置默认值, 此时属性类型为: String类型.
var titleString: String = "Today"
}
方案二: 将属性设置为可选类型.
class ViewController: UIViewController {
// 在String后面加上?, 此时属性的类型为: Optional String类型.
var titleString: String?
}
- 解释:
- 在类型名后面加?, 这个类型就变成可选类型(例如: Int? 代表 Optional Int 类型, 而不是 Int类型.)
- 声明一个可选类型的常量或者变量, 但没有赋值时, 它们会自动被设置为nil.(基础部分–nil)
! 强制解包
注: 解包也叫解析. 这是翻译问题.
代码
class ViewController: UIViewController {
var titleString: String?
override func viewDidLoad() {
super.viewDidLoad()
titleString = "Hello"
let appendString = titleString + " World!" /*< 编译器报错: Value of optiona