如何在Swift中观察NSObject数组?

8

我是一名刚接触Swift语言的新手,我的问题与如何在Swift中使用可观察/观察者模式有关。

我想要让我的数组在SocketManager类中成为可观察的,以便UIViewController类可以观察它。我使用了Andrew J Wagner编写的Observable类,我从这个链接中获取了它:

http://www.drewag.me/posts/swift-kvo-substitute-observable-variables

我有一个数组:

var marketIndexList: Array< MarketIndex > = []

它将从服务器获取数据。每当从服务器接收到新数据时,此列表将更新。在从服务器获取数组的值之后,我想将其转换为上面链接实现的Observable类:

marketIndexList = Observable(marketIndexList)

但我得到了这个错误:

'MarketIndex'不等同于'AnyObject'

MarketIndex是NSObject类型的类,具有某些字符串类型的属性。

这是我使用的Observable类:

import Foundation


class Observable {
    typealias DidChangeHandler = (oldValue: Array<MarketIndex>?, newValue: Array<MarketIndex>) -> ()

    var value : Array<MarketIndex> = [] {
        didSet {
            for (owner, handlers) in self.observers {
                for handler in handlers {
                    handler(oldValue: oldValue, newValue: value)
                }
            }
        }
    }

    init(_ value: Array<MarketIndex>) {
        self.value = value
    }

    func addObserverForOwner(owner: IndexViewController, triggerImmediately: Bool, handler: DidChangeHandler) {

        if let index = self.indexOfOwner(owner) {
            // since the owner exists, add the handler to the existing array
            self.observers[index].handlers.append(handler)
        } else {
            // since the owner does not already exist, add a new tuple with the
            // owner and an array with the handler
            self.observers.append(owner: owner, handlers: [handler])
        }

        if (triggerImmediately) {
            // Trigger the handler immediately since it was requested
            handler(oldValue: nil, newValue: self.value)
        }
    }

    func removeObserversForOwner(owner: AnyObject) {
        if let index = self.indexOfOwner(owner) {
            self.observers.removeAtIndex(index)
        }
    }

    // #pragma mark - Private Properties

    var observers: [(owner: IndexViewController, handlers: [DidChangeHandler])] = []

    // #pragma mark - Private Methods

    func indexOfOwner(owner: AnyObject) -> Int? {
        var index : Int = 0
        for (possibleOwner, handlers) in self.observers {
            if possibleOwner === owner {
                return index
            }
            index++
        }
        return nil
    }
}

有人能告诉我问题出在哪里吗?

同时,有人知道在Swift中如何观察对象数组吗?

非常感谢任何帮助。

提前致谢。

1个回答

2
错误的原因是因为marketIndexList被定义为Array<MarketIndex>,但是您赋值了一个Observable实例。也许您想要做类似这样的事情:
var observableList: Observable = Observable([])
var marketIndexList: Array<MarketIndex> = [MarketIndex(), MarketIndex()]
observableList.value = marketIndexList    

// Or maybe
observableList = Observable(marketIndexList)

顺便提一下,您也可以在Swift中使用Objective-C KVO。只需将属性标记为dynamic,并确保该类继承自NSObject以使属性可观察。例如:

class ObservableClass: NSObject {
    dynamic var value = [Int]()
}

除了您提到的内容,这篇文章对于Swift中的KVO也很值得阅读。 https://medium.com/proto-venture-technology/the-state-of-kvo-in-swift-aa5cb1e05cba


谢谢,但这并没有解决我的问题。在这一行仍然存在相同的错误: marketIndexList = Observable(marketIndexList) 我无法使我的数组可观察。 - user2366997
抱歉,我误解了您想要在Swift中使用Objective-C KVO的意图。我已经编辑了我的回答。 - Yoichi Tagaya
谢谢提供 Medium 链接,我更倾向于使用这种方法,以便我们可以充分利用 Swift! - gbdavid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接