gpt4 book ai didi

arrays - 如何快速观察一组对象?

转载 作者:IT王子 更新时间:2023-10-29 05:53:28 25 4
gpt4 key购买 nike

我是 swift 语言的新手,我的问题是关于如何在 swift 中使用可观察/观察者模式。

我想让我的数组在我的 SocketManager 类中可见,以便它可以被我的 UIViewController 类观察到。我使用了安德鲁·J·瓦格纳 (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 类型的类,它具有一些 String 类型的属性。

这是我使用的 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
}
}

谁能告诉我问题出在哪里?

还有人知道一种快速观察对象数组的方法吗?

如有任何帮助,我将不胜感激。

提前致谢。

最佳答案

错误是因为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

关于arrays - 如何快速观察一组对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28914319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com