Swift入门:属性

2020-03-19 20:47:11 浏览数 (1)

结构体和类(统称为“类型”)可以有自己的变量和常量,这些称为属性。这些方法允许您将值附加到类型以唯一地表示它们,但因为类型也可以有方法,所以您可以让它们根据自己的数据进行操作。

现在我们来看一个例子:

代码语言: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允许您添加要在属性即将更改或已更改时运行的代码。例如,这通常是在值更改时更新用户界面的好方法。

有两种属性观察者:willSetdidSet,它们在属性更改之前或之后调用。在willSet中,Swift为代码提供一个名为newValue的特殊值,该值包含新属性值将是什么,在didSet中,给您一个oldValue来表示前一个值。

让我们将两个属性观察者附加到Person结构的clothes属性:

代码语言:javascript复制
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属性,我们将执行以下操作:

代码语言:javascript复制
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

0 人点赞