属性和方法

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()
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容