返回

Swift 中属性的全面指南

IOS

掌握 Swift 中的属性:打造健壮且灵活的代码

在 Swift 中,属性是应用程序架构的核心元素,可让您存储、检索和操作数据。了解不同类型的属性以及如何有效地使用它们对于编写健壮且可维护的代码至关重要。

存储属性:数据驻留

存储属性与传统面向对象编程中的字段类似。它们使用 var 声明,并将数据直接存储在实例的内存中。

struct Person {
  var name: String
  var age: Int
}

访问存储属性就像访问其他任何变量一样:

let person = Person(name: "John", age: 30)
print(person.name) // 输出: "John"

计算属性:动态计算

计算属性不存储实际值,而是通过计算生成值。它们使用 var 关键字声明,并包含一个计算属性主体,它定义了如何计算属性值。

struct Rectangle {
  var width: Double
  var height: Double

  var area: Double {
    return width * height
  }
}

访问计算属性与访问存储属性相同:

let rectangle = Rectangle(width: 5.0, height: 10.0)
print(rectangle.area) // 输出: 50.0

属性包装器:自定义存储和检索

属性包装器是 Swift 5 中引入的强大工具。它们允许您通过创建一个定制的类型来修改属性的存储和检索行为。

@propertyWrapper
struct Clamped<T: Comparable> {
  private var value: T
  private let range: ClosedRange<T>

  var wrappedValue: T {
    get { return value }
    set { value = min(max(newValue, range.lowerBound), range.upperBound) }
  }
}

使用 @ 符号将包装器应用于属性:

struct Person {
  @Clamped(range: 0...150)
  var age: Int
}

属性观察器:值更改时的动作

属性观察器允许您在属性值更改时执行自定义代码。它们使用 willSetdidSet 关键字声明:

struct Person {
  var name: String {
    willSet {
      print("将要设置新名称:\(newValue)")
    }
    didSet {
      print("已设置新名称:\(name)")
    }
  }
}

属性懒加载:按需计算

属性懒加载可让您推迟计算属性值,直到首次访问该值。它们使用 lazy 关键字声明:

struct Person {
  lazy var fullName: String = {
    return "\(firstName) \(lastName)"
  }()
}

属性的最佳实践

编写有效属性的最佳实践包括:

  • 选择有意义且具有性的名称。
  • 优先考虑计算属性以节省内存。
  • 仅在必要时使用属性包装器和观察器。
  • 谨慎使用属性懒加载。
  • 确保属性始终返回相同类型的值。

结论

属性是构建健壮且灵活的 Swift 代码的基础。通过掌握存储属性、计算属性、属性包装器、属性观察器和属性懒加载,您可以充分利用 Swift 的功能并编写更优质的应用程序。

常见问题解答

1. 我应该何时使用存储属性而不是计算属性?

当需要在实例内存中存储数据时,请使用存储属性。对于可以通过其他属性轻松计算的值,请使用计算属性。

2. 属性包装器有什么好处?

属性包装器提供了自定义属性存储和检索行为的灵活性,例如范围检查、验证或数据加密。

3. 属性观察器如何与属性包装器交互?

属性包装器的 wrappedValue 属性可以使用属性观察器。这提供了进一步的定制和处理属性更改的能力。

4. 属性懒加载有什么缺点?

属性懒加载可能会增加计算开销,尤其是对于在整个程序中频繁访问的属性。

5. Swift 中的属性是否有访问控制权限?

是的,属性具有与变量和方法相同的访问控制权限(例如 publicprivateinternal)。