结构体和类(统称为“类型”)可以有自己的变量和常量,这些称为属性。这些方法允许您将值附加到类型以唯一地表示它们,但因为类型也可以有方法,所以您可以让它们根据自己的数据进行操作。
现在我们来看一个例子:
代码语言:javascript复制struct Person {
var clothes: String
var shoes: String
func describe() {
print("I like wearing (clothes) with (shoes)")
}
}
let taylor = Person(clothes: "T-shirts", shoes: "sneakers")
let other = Person(clothes: "short skirts", shoes: "high heels")
taylor.describe()
other.describe()
如您所见,当您在方法中使用属性时,它将自动使用属于同一对象的值。
属性观察者
Swift允许您添加要在属性即将更改或已更改时运行的代码。例如,这通常是在值更改时更新用户界面的好方法。
有两种属性观察者:willSet
和didSet
,它们在属性更改之前或之后调用。在willSet
中,Swift为代码提供一个名为newValue
的特殊值,该值包含新属性值将是什么,在didSet
中,给您一个oldValue
来表示前一个值。
让我们将两个属性观察者附加到Person
结构的clothes
属性:
struct Person {
var clothes: String {
willSet {
updateUI(msg: "I'm changing from (clothes) to (newValue)")
}
didSet {
updateUI(msg: "I just changed from (oldValue) to (clothes)")
}
}
}
func updateUI(msg: String) {
print(msg)
}
var taylor = Person(clothes: "T-shirts")
taylor.clothes = "short skirts"
这将打印出“I'm changing from T-shirts to short skirts”和“I just changed from T-shirts to short skirts.”的信息
计算属性
可以创建实际上是幕后代码的属性。例如,我们已经使用了字符串的uppercased()
方法,但也有一个名为capitalized
的属性根据需要进行计算,而不是每个字符串总是存储其自身的大写版本。
若要生成计算属性,请在属性后放置一个大括号,然后使用“get”或“set”在适当的时间执行操作。例如,如果我们想添加一个自动返回一个人的年龄乘以7的ageInDogYears
属性,我们将执行以下操作:
struct Person {
var age: Int
var ageInDogYears: Int {
get {
return age * 7
}
}
}
var fan = Person(age: 25)
print(fan.ageInDogYears)
计算属性在苹果的代码中越来越常见,但在用户代码中却不太常见。
注意:如果您只打算将它们用于读取数据,则可以完全删除get部分,如下所示:
代码语言:javascript复制var ageInDogYears: Int {
return age * 7
}
本文来自Hacking with Swift 给 swift 初学者的入门课程 Swift for Complete Beginners 的 Properties