Swift基础语法: 31 - Swift的初始化, 默认属性值, 初始化参数, 内部和外部参数, 可选属性类型
在前面我们把继承这东西讲解完了, 本质上是和OC中的继承是没有多大区别的, 就是多了一些特性, 一开始不记得没关系, 后面随着我们做项目, 越做会越熟练的, 好了, 现在让我们来继续往下看:
1.初始化
Swift中的初始化其实和OC的初始化没多大区别, 但唯一不同的就是, Swift在构造的过程是不需要返回值的, 只要保证新实例在第一次使用的时候能够正确的完成初始化就可以了.
类和结构体在初始化的时候, 必须为所有存储型属性设置合适的默认值.
PS: 如果我们为存储型属性设置默认值, 或者在初始化方法中给存储性属性赋值, 是不会触发任何属性观测器的.
例子:
struct Fahrenheit {
var temperature: Double
init() {
temperature = 32.0
}
}
var f = Fahrenheit()
println("The default temperature is \(f.temperature)° Fahrenheit")
// 打印出来的结果: The default temperature is 32.0° Fahrenheit
2.默认属性值
所谓的默认属性值, 就是在我们的初始化方法中所存储的数值, 比如:
struct Fahrenheit {
var temperature = 32.0
}
PS: 例子中的temperature的默认值就是32了.
3.初始化的参数
在我们初始化的过程中, 我们可以加入一些参数和可选属性类型来定制我们需要的初始化方法, 也可以在初始化方法中对常量进行修改, 比如:
struct Celsius {
var temperatureInCelsius: Double = 0.0
init(fromFahrenheit fahrenheit: Double) {
temperatureInCelsius = (fahrenheit - 32.0) / 1.8
}
init(fromKelvin kelvin: Double) {
temperatureInCelsius = kelvin - 273.15
}
}
let boilingPointOfWater = Celsius(fromFahrenheit: 212.0)
println(boilingPointOfWater.temperatureInCelsius)
// 打印出来的结果: 100.0
let freezingPointOfWater = Celsius(fromKelvin: 273.15)
println(freezingPointOfWater.temperatureInCelsius)
// 打印出来的结果: 0.0
PS: 仔细的人会按着 Option 键去看看 fahrenheit 和 kelvin 是什么类型, 一旦我们查看到之后, 我们就发现, 原来这两个形参都是 let 类型.
4.内部和外部参数
与方法, 函数一样, 初始化的时候, 我们可以添加外部参数, 这样子我们就可以在初始化的时候, 一次性初始化我们需要的多个默认属性或者是默认值, 比如:
struct Color {
let red = 0.0, green = 0.0, blue = 0.0
init(red: Double, green: Double, blue: Double) {
self.red = red
self.green = green
self.blue = blue
}
}
let magenta = Color(red: 1.0, green: 0.0, blue: 1.0)
println("\(magenta.red), \(magenta.green), \(magenta.blue)")
// 打印出来的结果: 1.0, 0.0, 1.0
PS: Swift 会为每个构造器的参数自动生成 一个跟内部名字相同的外部名, 就相当于在每个构造参数之前加了一个哈希符号, 如果你不希望为构造器的某个参数提供外部名字, 你可以使用下划线 ‘_’ 来显示描述它的外部名, 以此覆盖上面所说的默认行为.
5.可选属性类型
如果我们在定义初始化方法的时候, 有一个允许取值为空的存储型属性, 不管它是在初始化时赋值, 还是在调用的时候复制, 我们都必须给它设置成可选类型, 因为可选类型会自动初始化为空, 比如:
class SurveyQuestion {
var text: String
var response: String?
init(text: String) {
self.text = text
}
func ask() {
println(text)
}
}
let cheeseQuestion = SurveyQuestion(text: "Do you like cheese?")
cheeseQuestion.ask()
// 打印出来的结果: Do you like cheese?
cheeseQuestion.response = "Yes, I do like cheese."
println(cheeseQuestion.response)
// 打印出来的结果:Optional("Yes, I do like cheese.")
PS: 这个模式就类似于问答卷一样, 先知道问题, 然后由我们去回答, 如果不回答, 那么默认就是空的.
好了, 这次我们就讲到这里, 下次我们继续