Ich bin neu in der schnellen Sprache und mein Problem ist, wie beobachtbar/Beobachter Muster in Swift verwenden.Wie beobachtet man ein Array von NSObjects in swift?
Ich möchte, dass mein Array in meiner SocketManager-Klasse beobachtbar ist, damit es von meiner UIViewController-Klasse beobachtet werden kann. Ich habe die Klasse Observable geschrieben von Andrew J Wagner verwendet, die ich von diesem Link bekam:
http://www.drewag.me/posts/swift-kvo-substitute-observable-variables
Ich habe das Array:
var marketIndexList: Array < market> = []
welches seine Daten von einem Server erhält. Diese Liste wird jedes Mal aktualisiert, wenn neue Daten vom Server empfangen werden. Nachdem ich die Werte meines Array von Server bekam ich will es vom Typ Klasse Observable machen, die durch den obigen Link implementiert:
marketIndexList = beobachtbare (marketIndexList)
Aber ich habe diesen Fehler:
"MarketIndex" ist nicht identisch mit "AnyObject"
MarketIndex ist eine Klasse vom Typ NSObject, die einige Eigenschaften vom Typ String hat.
Dies ist die Klasse Observable, die ich verwendet habe:
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
}
}
Kann mir jemand sagen, was das Problem ist?
Kennt jemand auch eine Möglichkeit, ein Array von Objekten in swift zu beobachten?
Ich würde jede Hilfe zu schätzen wissen.
Vielen Dank im Voraus.
Danke, aber das löst mein Problem nicht. Derselbe Fehler ist in dieser Zeile weiterhin vorhanden: marketIndexList = Observable (marketIndexList) Ich kann mein Array nicht beobachtbar machen. – user2366997
Entschuldigung, ich hatte ein Missverständnis, dass Sie das Objective-C KVO von Swift verwenden wollten. Ich habe meine Antwort bearbeitet. –
Danke für das Medium Link, ich benutze lieber diesen Ansatz, damit wir das Beste aus Swift herausholen können! – gbdavid