2015-03-07 9 views
8

मैं तेजी से भाषा में नया हूं और मेरी समस्या यह है कि तेजी से अवलोकन/पर्यवेक्षक पैटर्न का उपयोग कैसे करें।तेजी से NSObjects की एक सरणी का निरीक्षण कैसे करें?

मैं अपनी सरणी को मेरी सॉकेट मैनेजर कक्षा में देखने योग्य बनाना चाहता हूं ताकि इसे मेरे UIViewController क्लास द्वारा देखा जा सके। मैं प्रत्यक्ष वर्ग एंड्रयू जे वैगनर द्वारा लिखित जो मैं इस लिंक से मिल गया का इस्तेमाल किया है:

वर marketIndexList:

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

मैं सरणी है सरणी < MarketIndex> = []

जो सर्वर से अपना डेटा प्राप्त करेगा। यह सूची हर बार सर्वर से प्राप्त एक नया डेटा अपडेट किया जाएगा। बाद मैं सर्वर से मेरी सरणी के मूल्यों मिल गया मैं प्रकार प्रत्यक्ष वर्ग जो ऊपर के लिंक द्वारा कार्यान्वित किया जाता का यह बनाना चाहते:

marketIndexList = प्रत्यक्ष (marketIndexList)

लेकिन मैं यह त्रुटि आई:

'MarketIndex' 'AnyObject' के समान नहीं है

मार्केटइंडेक्स एनएसओब्जेक्ट प्रकार का एक वर्ग है जिसमें स्ट्रिंग के कुछ गुण हैं।

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 
    } 
} 

किसी को भी मुझे बता सकते हैं कि समस्या क्या है:

यह प्रत्यक्ष वर्ग है कि मैं का इस्तेमाल किया है है?

क्या किसी को भी तेजी से वस्तुओं की एक श्रृंखला का निरीक्षण करने का तरीका पता है?

मैं किसी भी मदद की सराहना करता हूं।

अग्रिम धन्यवाद।

उत्तर

2

त्रुटि इसलिए है क्योंकि marketIndexList को Array<MarketIndex> के रूप में परिभाषित किया गया है लेकिन आपने Observable उदाहरण असाइन किया है। शायद आप इस तरह कुछ करना चाहता था: वैसे

var observableList: Observable = Observable([]) 
var marketIndexList: Array<MarketIndex> = [MarketIndex(), MarketIndex()] 
observableList.value = marketIndexList  

// Or maybe 
observableList = Observable(marketIndexList) 

, आप भी स्विफ्ट से ऑब्जेक्टिव-सी KVO उपयोग कर सकते हैं। बस संपत्ति को dynamic के रूप में चिह्नित करें और सुनिश्चित करें कि कक्षा को संपत्ति को देखने योग्य बनाने के लिए एनएसओब्जेक्ट प्राप्त हुआ है। उदाहरण के लिए:

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

यह पोस्ट स्विफ्ट में केवीओ के लिए पढ़ने के लिए अच्छा है जिसे आपने संदर्भित किया है। https://medium.com/proto-venture-technology/the-state-of-kvo-in-swift-aa5cb1e05cba

+0

धन्यवाद, लेकिन यह मेरी समस्या का समाधान नहीं करता है। इस लाइन पर एक ही त्रुटि अभी भी मौजूद है: marketIndexList = Observable (marketIndexList) मैं अपनी सरणी को देखने योग्य नहीं बना सकता। – user2366997

+0

क्षमा करें, मुझे गलतफहमी थी कि आप स्विफ्ट से उद्देश्य-सी केवीओ का उपयोग करना चाहते थे। मैंने अपना जवाब संपादित किया। –

+0

मध्यम लिंक के लिए धन्यवाद, मैं उस दृष्टिकोण का उपयोग करता हूं ताकि हम तेजी से बाहर निकल सकें! – gbdavid

संबंधित मुद्दे