1、属性
存储属性
struct FixedLengthRange {
var firstValue: Int
let length: Int
}
var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)
// 该整数范围表示整数值 0、1 和 2
rangeOfThreeItems.firstValue = 6
// 该整数范围现在表示整数值 6、7 和 8
延迟存储属性
class DataImporter {
/*
DataImporter 是一个从外部文件导入数据的类。
假设该类需要花费大量时间来初始化。
*/
var filename = "data.txt"
// DataImporter 类将在此处提供数据导入功能
}
class DataManager {
lazy var importer = DataImporter()
var data = [String]()
// DataManager 类将在此处提供数据管理功能
}
let manager = DataManager()
manager.data.append("Some data")
manager.data.append("Some more data")
// 类型为 DataImporter 的 importer 属性实例尚未创建
计算属性
struct Point {
var x = 0.0, y = 0.0
}
struct Size {
var width = 0.0, height = 0.0
}
struct Rect {
var origin = Point()
var size = Size()
var center: Point {
get {
let centerX = origin.x + (size.width / 2)
let centerY = origin.y + (size.height / 2)
return Point(x: centerX, y: centerY)
}
set(newCenter) {
origin.x = newCenter.x - (size.width / 2)
origin.y = newCenter.y - (size.height / 2)
}
}
}
var square = Rect(origin: Point(x: 0.0, y: 0.0),
size: Size(width: 10.0, height: 10.0))
let initialSquareCenter = square.center
square.center = Point(x: 15.0, y: 15.0)
print("square.origin is now at (\(square.origin.x), \(square.origin.y))")
// 打印 "square.origin is now at (10.0, 10.0)"
只读计算属性
只有 getter 方法但没有 setter 方法的计算属性称为 只读计算属性 。只读计算属性始终返回一个值,可以通过点语法访问,但不能给它赋值。
struct Cuboid {
var width = 0.0, height = 0.0, depth = 0.0
var volume: Double {
return width * height * depth
}
}
let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0)
print("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)")
// 打印 "the volume of fourByFiveByTwo is 40.0"
属性观察器
属性观察器会观察并对属性值的变化做出反应。每次设置属性值时都会调用属性观察器,即使新值与属性的当前值相同。
class StepCounter {
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
print("将要设置 totalSteps 为 \(newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
print("增加了 \(totalSteps - oldValue) 步")
}
}
}
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// 将要设置 totalSteps 为 200
// 增加了 200 步
stepCounter.totalSteps = 360
// 将要设置 totalSteps 为 360
// 增加了 160 步
stepCounter.totalSteps = 896
// 将要设置 totalSteps 为 896
// 增加了 536 步
2、方法
实例方法
class Counter {
var count = 0
func increment() {
count += 1
}
func increment(by amount: Int) {
count += amount
}
func reset() {
count = 0
}
}
实例方法中修改值类型
结构体和枚举是 值类型 。默认情况下,无法在其实例方法中修改值类型的属性。
你可以通过在方法的 func 关键字前放置 mutating 关键字来选择开启此行为
struct Point {
var x = 0.0, y = 0.0
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
x += deltaX
y += deltaY
}
}
var somePoint = Point(x: 1.0, y: 1.0)
somePoint.moveBy(x: 2.0, y: 3.0)
print("The point is now at (\(somePoint.x), \(somePoint.y))")
// 打印 "The point is now at (3.0, 4.0)"
类型方法
class SomeClass {
class func someTypeMethod() {
// 这里是类型方法的实现细节
}
}
SomeClass.someTypeMethod()