【问题标题】:Observers in swift观察者迅速
【发布时间】:2016-12-22 19:21:36
【问题描述】:

在创建了一个 Triangle 类并使用了一个名为 isEquilateral 的只读计算属性之后,它将像这样确定是否相等

    class Triangle {
    var a: Int
    var b: Int
    var c: Int
    // initialization stuff
    var isEquilateral: Bool {
    return (sideA, sideB) == (sideB, sideC)
    }
}

我如何添加一个观察者来检查长度是否发生变化,比如说不同类型的三角形?我是将其添加到计算属性(isEquilateral)内部还是外部?

【问题讨论】:

    标签: swift readonly observers


    【解决方案1】:

    this教程中所说:

    在你的情况下:

    var a: Int {
        willSet {
            // First time set
        }
        didSet {
            // Value changed
        }
    }
    var b: Int ...
    var c: Int ...
    

    这种方法对我有用几次

    【讨论】:

    • 请包含一些与实际问题相关的代码。此代码将如何帮助 OP?
    • 他会知道下次怎么做,这个方法对我有用几次
    • 我同意。 didSet 会有所帮助
    【解决方案2】:

    如果您想跟踪课外的更改,可以使用通知中心。示例:

    class Triangle {
    var a: Int {
        didSet {
            NotificationCenter.default.post(Notification(name: Notification.Name(rawValue: "aValueChanged"), object: self))
        }
    }
    
    func randomFunc() {
        a = 20
    }
    }
    

    并捕捉这些通知:

    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.someFunc), name: NSNotification.Name(rawValue: "aValueChanged"), object: nil)
    triangle.something()
    

    以及接收通知的方法:

    func someFunc(notification: Notification) {
        let triangle = notification.object as! Triangle
        print("a value to \(triangle.a)")
    }
    

    这将允许您检查课程之外的更改。输出将是a value changed to 20

    【讨论】:

      【解决方案3】:

      Property Observer 正是您要找的:

      属性观察者观察并响应属性的变化 价值。每次属性值被调用时,都会调用属性观察者 设置,即使新值与属性的当前值相同 价值。

      假设你想观察a属性的变化,你可以实现为:

      class Triangle {
          var a: Int? {
              willSet {
                  print("the new value is about to be: \(newValue)")
              }
              didSet {
                  print("the old value was: \(oldValue)")
              }
          }
      
          var b: Int?
          var c: Int?
      
          // initialization stuff
      
          // ...
      }
      

      调用(跟踪):

      let myTriangle = Triangle()
      
      myTriangle.a = 10
      // this will print:
      // the new value is about to be: Optional(10)
      // the old value was: nil (nil because it's optional...)
      
      // re-assign a new value:
      
      myTriangle.a = 20
      // this will print:
      // the new value is about to be: Optional(20)
      // the old value was: Optional(10)
      

      如您所见,它会让您知道a 的值已更改,还告诉您旧值和新值是什么。

      因此,通过实现 a 作为属性观察者,您可以在更改 a 属性的值时添加您的自定义行为;假设-例如-您想让c 等于a 的新值(如果它发生变化):

      var a: Int? {
              willSet {
                  print("the new value is about to be: \(newValue)")
                  b = newValue
              }
              didSet {
                  print("the old value was: \(oldValue)")
              }
          }
      

      或者——另一个例子——你想在改变a的值时调用一个函数来做某事:

      var a: Int? {
          willSet {
              print("the new value is about to be: \(newValue)")
              doSomething()
          }
          didSet {
              print("the old value was: \(oldValue)")
          }
      }
      
      private func doSomething() {
          print("doing something...")
      }
      

      有关更多信息,我建议查看Apple Documentation - “Property Observers”部分。

      希望对您有所帮助。

      【讨论】:

      • 好的,我想我现在明白了。我还有一个问题。我需要为每个变量(b 和 c)放置 willset 和 didset 吗?
      • 不,你没有。如文档中所述:“您可以选择在属性上定义其中一个或两个观察者:将在存储值之前调用 willSet。在存储新值后立即调用 didSet。”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 2023-04-10
      • 1970-01-01
      相关资源
      最近更新 更多