Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何观察和显示价值的变化?迅速地_Ios_Swift_Swift2 - Fatal编程技术网

Ios 如何观察和显示价值的变化?迅速地

Ios 如何观察和显示价值的变化?迅速地,ios,swift,swift2,Ios,Swift,Swift2,我有一个变量,它获取不同类中数组中的对象数,如何跟踪当前类中该变量的变化?我做了很多不同的尝试,但都失败了 var digitIndex: Int! { set { self.digitIndex = newValue } get { return firstClass.indexesOfSelectedNodes().count } } override func

我有一个变量,它获取不同类中数组中的对象数,如何跟踪当前类中该变量的变化?我做了很多不同的尝试,但都失败了

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)"
            }
        }
    }
var digitIndex:Int!{
设置{
self.digitIndex=newValue
}
得到{
返回firstClass.indexesOfSelectedNodes().count
}
}
重写func observeValueForKeyPath(键路径:String?,对象对象的类型:AnyObject?,更改:[String:AnyObject]?,上下文:UnsafeMutablePointer){
如果上下文==&数字索引{
如果让newValue=更改?[NSKeyValueChangeNewKey]{
打印(“新值”)
infoLabel.text=“\(newValue)”
}
}
}
试试这个:

var digitIndex: Int! {
        set {
            self.digitIndex = newValue
        }
        get {
            return firstClass.indexesOfSelectedNodes().count
        }
        didSet {
            //you will get new value here
        }
    }
不需要为我们的类属性添加观察者,您只需要为超级类提供的属性添加观察者。

尝试以下操作:

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

不需要为我们的类属性添加观察者,您只需要为super类提供的属性添加观察者。

您可以使用代理处理两个类之间的通信

下面的示例使用自定义委托
MyDelegate
(协议)。委托实例在
MyOtherClass
中初始化(例如,视图控制器类),每当在该类中更新数组
myArr
时,该类都会进行委托回调。这反过来会更新
MyCurrentClass
digitIndex
的值(例如,一些自定义控件),该控件通过实现蓝印
arrUpdated(…)
方法符合
MyDelegate
。最后,
MyCurrentClass
中的
digitIndex
上的
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
    }
}
测试:


您可以使用一个委托来处理两个类之间的通信

下面的示例使用自定义委托
MyDelegate
(协议)。委托实例在
MyOtherClass
中初始化(例如,视图控制器类),每当在该类中更新数组
myArr
时,该类都会进行委托回调。这反过来会更新
MyCurrentClass
digitIndex
的值(例如,一些自定义控件),该控件通过实现蓝印
arrUpdated(…)
方法符合
MyDelegate
。最后,
MyCurrentClass
中的
digitIndex
上的
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
    }
}
测试:

1) 在代码中

var digitIndex: Int! {
        set {
            self.digitIndex = newValue
        }
        get {
            return firstClass.indexesOfSelectedNodes().count
        }
    }
digitIndex是计算属性!您无法在自己的setter中设置self.digitIndex

此代码即使已编译,也将永远运行:-)

2) 如何使用willSet和didSet(存储属性)

您可以将计算属性和存储属性结合起来以获得优势

// '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
/“专用”存储
var_j:Int=0
变量j:Int{
得到{
返回
}
设置{
打印(新值)
如果newValue<300{
_j=新值
}否则{
打印(新值,“拒绝”)
}
}
}
print(j)//打印0
j=200//200
print(j)//prints 200
j=500//500次打印被拒绝
print(j)//prints 200
1)在您的代码中

var digitIndex: Int! {
        set {
            self.digitIndex = newValue
        }
        get {
            return firstClass.indexesOfSelectedNodes().count
        }
    }
digitIndex是计算属性!您无法在自己的setter中设置self.digitIndex

此代码即使已编译,也将永远运行:-)

2) 如何使用willSet和didSet(存储属性)

您可以将计算属性和存储属性结合起来以获得优势

// '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
/“专用”存储
var_j:Int=0
变量j:Int{
得到{
返回
}
设置{
打印(新值)
如果newValue<300{
_j=新值
}否则{
打印(新值,“拒绝”)
}
}
}
print(j)//打印0
j=200//200
print(j)//prints 200
j=500//500次打印被拒绝
print(j)//prints 200

您尝试过这个吗?先试试看,然后再回答!你试过这个吗?先试试看,然后再回答!