2016-01-13 67 views
0

我有一個變量,它接受不同類中數組中對象的數量,我如何跟蹤當前類中這個變量的變化?我做了很多不同的嘗試,但都失敗了。如何觀察價值的變化並展示它?在Swift中

var digitIndex: Int! { 
     set { 
      self.digitIndex = newValue 
     } 
     get { 
      return firstClass.indexesOfSelectedNodes().count 
     } 
    } 

    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 
     if context == &digitIndex { 
      if let newValue = change?[NSKeyValueChangeNewKey] { 
       print("newValue") 
       infoLabel.text = "\(newValue)" 
      } 
     } 
    } 

回答

3

1)計算的財產!您無法在自己的setter中設置self.digitIndex!

此代碼,即使編譯,將永遠:-)

var i: Int { 
    get { 
     return 10 
    } 
    set { 
     i = newValue 
    } 
} 

i = 100 
print(i) 

2)如何使用willSet和didSet(存儲性能)上運行?

class C1 {} 
class C2 {} 

class C { 
    var objects: [AnyObject] = [C1(),C1(),C2()] { 
     willSet { 
      print(objects, objects.count, newValue) 
     } 
     didSet { 
      print(objects, objects.count) 
     } 
    } 
    func add(object: AnyObject) { 
     objects.append(object) 
    } 
} 

let c = C() 
c.add(C1()) 
/* 
[C1, C1, C2] 3 [C1, C1, C2, C1] 
[C1, C1, C2, C1] 4 
*/ 

var i: Int = 0 { 
willSet { 
    print(newValue, "will replace", i) 
} 
didSet { 
    print(oldValue, "was replaced by", i) 
} 
} 

i = 100 
/* 
100 will replace 0 
0 was replaced by 100 
*/ 

你可以結合你的優勢

// 'private' storage 
var _j:Int = 0 
var j: Int { 
get { 
    return _j 
} 
set { 
    print(newValue) 
    if newValue < 300 { 
    _j = newValue 
    } else { 
     print(newValue, "refused") 
    } 
} 
} 

print(j) // prints 0 
j = 200 // prints 200 
print(j) // prints 200 
j = 500 // prints 500 refused 
print(j) // prints 200 
0

試試這個:

var digitIndex: Int! { 
     set { 
      self.digitIndex = newValue 
     } 
     get { 
      return firstClass.indexesOfSelectedNodes().count 
     } 
     didSet { 
      //you will get new value here 
     } 
    } 

無需添加觀測我們的類的屬性,你只需要增加觀察員由超類提供的屬性。

+0

你嘗試這種計算和存儲性能?先回答,然後再回答! – user3441734

0

您可以使用委託來處理兩個類之間的通信。

以下示例使用自定義代理MyDelegate(協議)。代理實例在MyOtherClass(例如,視圖控制器類)中初始化,該代理實例在該類中更新數組myArr時進行委託回調。這又通過實施藍圖arrUpdated(..)方法來更新MyCurrentClass(例如,一些自定義控件)中的digitIndex的值,其符合MyDelegate。最後, 上的didSet資產觀察員通過控制檯打印告訴我們它的值已更新。

protocol MyDelegate: class { 
    func arrUpdated(arr: [Int]) 
} 

class MyDifferentClass { 
    private var myArr : [Int] = [] { 
     didSet { 

      // Call delegate. 
      delegate?.arrUpdated(myArr) 
     } 
    } 

    weak var delegate: MyDelegate? 
} 

class MyCurrentClass: MyDelegate { 
    var myDifferentClass : MyDifferentClass 
    var digitIndex: Int = 0 { 
     didSet { 
      print("digitIndex updated: \(digitIndex)") 
     } 
    } 

    init(a: MyDifferentClass) { 
     myDifferentClass = a 
     myDifferentClass.delegate = self 
    } 

    // MyDelegate 
    func arrUpdated(arr: [Int]) { 
     digitIndex = arr.count 
    } 
} 

測試:在你的代碼

var digitIndex: Int! { 
     set { 
      self.digitIndex = newValue 
     } 
     get { 
      return firstClass.indexesOfSelectedNodes().count 
     } 
    } 

digitIndex

var a = MyDifferentClass() 
var b = MyCurrentClass(a: a) 

a.myArr.append(1) // prints 'digitIndex updated: 1'