2014-11-20 7 views
8

पर तत्व जोड़ा/हटाए जाने पर अधिसूचित हो जाएं जब मैं किसी सरणी से जोड़ा/निकाला गया तत्व अधिसूचित होना चाहता था। हम सरणियों बारे में बात नहीं कर रहे हैं, जब एक स्ट्रिंग बदल गया है उदाहरण के अधिसूचित होने के लिए, वहाँ तेज में एक अच्छा समाधान है:सरणी

private var privateWord: String? 
var word: String? { 
    get { 
     return privateWord 
    } 
    set { 
     if newValue != "" { 
      notifyThatWordIsChanged() 
     } else { 
      notifyThatWordIsEmpty() 
     } 
     privateWord = newValue 
    } 
} 

हम एक ऐसी ही परिणाम हासिल कर सकते हैं, जब मैं जोड़ने/एक करने के लिए एक तत्व को दूर सरणी?

उत्तर

4

आप कक्षा/संरचना जैसे प्रॉक्सी बना सकते हैं जिसमें सरणी के समान इंटरफ़ेस होगा, दृश्यों के नीचे मानक सरणी संग्रहीत करेगा और स्टोर सरणी की ओर से कार्य करेगा। यहाँ छोटा सा उदाहरण है:

struct ArrayProxy<T> { 
    var array: [T] = [] 

    mutating func append(newElement: T) { 
     self.array.append(newElement) 
     print("Element added") 
    } 

    mutating func removeAtIndex(index: Int) { 
     print("Removed object \(self.array[index]) at index \(index)") 
     self.array.removeAtIndex(index) 
    } 

    subscript(index: Int) -> T { 
     set { 
      print("Set object from \(self.array[index]) to \(newValue) at index \(index)") 
      self.array[index] = newValue 
     } 
     get { 
      return self.array[index] 
     } 
    } 
} 

var a = ArrayProxy<Int>() 
a.append(1) 
+0

यह एक अच्छा समाधान नहीं है - लेकिन यह है कि अन्य सभी सरणी विधियों (मानचित्र की तरह, प्रकार, आदि) को ध्यान में रखा जाना चाहिए और गुण उपलब्ध नहीं हैं, जब तक कि स्वयं एक समान तरीके से लपेटा – Antonio

+1

@ एंटोनियो हाँ, लेकिन मुझे लगता है कि अंतर्निहित सरणी का उपयोग करना आसान है। 'a.array = a.array.map {...}' – Kirsteins

+0

हाँ यह सिर्फ यह कहना चाहता था कि यह वास्तविक 'ऐरे' नहीं है, और यह * एक 'ऐरे' जैसा नहीं है (जिसका अर्थ है कि आप पास नहीं कर सकते यह एक सरणी के उदाहरण की अपेक्षा कार्यों के लिए)। मेरा हालांकि आलोचना नहीं है - बस एक स्पष्टीकरण। विचार अच्छा है, लेकिन निश्चित रूप से यह सभी मामलों के लिए समाधान नहीं है – Antonio