返回

Swift 属性与属性观察者详解

见解分享

存储属性

存储属性是 Swift 类的基本属性类型,用于存储数据。存储属性可以是变量,也可以是常量。变量的属性值可以被修改,而常量的属性值不能被修改。存储属性的语法如下:

var name: String
let age: Int

计算属性

计算属性是通过其他属性的值计算出来的属性。计算属性不能存储数据,只能通过其他属性的值来计算出一个值。计算属性的语法如下:

var fullName: String {
  return firstName + " " + lastName
}

延迟存储属性

延迟存储属性是延迟实例创建的属性。延迟存储属性的初始值是 nil,当第一次访问延迟存储属性时,才会实例化该属性。延迟存储属性的语法如下:

lazy var view: UIView = {
  return UIView()
}()

类型属性

类型属性是与类关联的数据,而不是与类的实例关联。类型属性可以在类的实例中访问,也可以在类的类方法中访问。类型属性的语法如下:

static let sharedInstance = MyClass()

属性观察者

属性观察者允许你监视属性值的改变。属性观察者有两种类型:didSetwillSetdidSet 属性观察者在属性值改变后被调用,而 willSet 属性观察者在属性值改变前被调用。属性观察者的语法如下:

var name: String {
  didSet {
    print("Name changed from \(oldValue) to \(name)")
  }
}

属性包装器

属性包装器允许你自定义属性的行为。属性包装器可以用于验证属性值、加密属性值等。属性包装器的语法如下:

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

  init(wrappedValue: Value, range: ClosedRange<Value>) {
    self.value = wrappedValue
    self.range = range
  }

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

@Clamped(range: 0...100)
var score: Int

@objc 和 dynamic 属性

@objc 属性允许你将 Swift 属性暴露给 Objective-C 代码。dynamic 属性允许你动态地改变属性的值,即使该属性是一个常量。@objcdynamic 属性的语法如下:

@objc dynamic var name: String

关联属性

关联属性允许你将一个属性与另一个属性相关联。关联属性的语法如下:

class Person {
  var name: String
  var age: Int

  weak var spouse: Person? {
    didSet {
      spouse?.spouse = self
    }
  }
}

结论

Swift 的属性和属性观察者提供了灵活的方式来存储和管理数据。通过使用属性观察者,你可以监视属性值的改变,并采取相应的操作。通过使用属性包装器,你可以自定义属性的行为。通过使用 @objcdynamic 属性,你可以将 Swift 属性暴露给 Objective-C 代码。通过使用关联属性,你可以将一个属性与另一个属性相关联。