2015-04-07 9 views
14

जब मैं noise फ़ंक्शन को ओवरराइड करता हूं, तो फ़ंक्शन को नए द्वारा प्रतिस्थापित किया जाता है। लेकिन जब मैं एक पर्यवेक्षक के साथ एक संपत्ति को ओवरराइड करता हूं, तो पुराना और नया मूल्य दोनों निष्पादित हो जाता है।संपत्ति पर्यवेक्षक को ओवरराइड करें

खेल का मैदान में:

class Vehicle { 
    func noise(sound: String) { 
     println("Vehicle sound sounds like \(sound)") 
    } 
} 

class Train: Vehicle { 
    override func noise(sound: String) { 
     println("A train does: \(sound)") 
    } 
} 

आउटपुट:

var oldTrain = Train() 
bulletTrain.noise("tjoek tjoek") // Prints: "A train does: tjoek tjoek" 

लेकिन जब मैं एक पर्यवेक्षक के साथ एक संपत्ति के साथ भी ऐसा ही:

खेल का मैदान में:

class Foo { 
    var something: Int! { 
     didSet { 
      println("vroom") 
     } 
    } 
} 

class Bar: Foo { 
    override var something: Int! { 
     didSet { 
      println("toot toot") 
     } 
    } 
} 

आउटपुट:

var foobar = Bar() 
foobar.something = 3 // Prints: "vroom" & "toot toot" 

तो मुझे पर्यवेक्षक के साथ एक संपत्ति को ओवरराइड करना और पुराने मूल्यों को कैसे निष्पादित करना है, इसे कैसे रोकना है?

+0

पुरानी संपत्ति पर्यवेक्षक को निष्पादित करने से रोकने का कोई तरीका नहीं लगता है। – mrahmiao

+0

यह आश्चर्यजनक है कि आप 'didSet' – Fattie

उत्तर

24

आप संपत्ति के set और get ओवरराइड कर सकते हैं और अपना println स्थानांतरित कर सकते हैं। इस तरह स्विफ्ट मूल कोड को कॉल नहीं करेगा - जब तक कि आप सुपर को कॉल न करें।

class Foo { 
    private var _something: Int! 

    var something: Int! { 
     get { 
      return _something 
     } 
     set { 
      _something = newValue 
      println("vroom") 
     } 
    } 
} 

class Bar: Foo { 
    override var something: Int! { 
     get { 
      return _something 
     } 
     set { 
      _something = newValue 
      println("toot toot") 
     } 
    } 
} 

हालांकि यह सुंदर नहीं है।

class Foo { 
    var something: Int! { 
     didSet { 
      somethingWasSet() 
     } 
    } 

    func somethingWasSet() { 
     println("vroom") 
    } 
} 

class Bar: Foo { 
    override func somethingWasSet() { 
     println("toot toot") 
    } 
} 

के बाद से वहाँ कोई रास्ता नहीं है "ओवरराइड" didSet, क्या रहता है विशेष रूप से उस उद्देश्य के लिए बनाई गई एक उच्च माध्यमिक समारोह अधिभावी है करने के लिए: - और सरल - समाधान

यहाँ एक बेहतर है।

+0

ओवरराइड नहीं कर सकते जैसा कि @nhgrif द्वारा सुझाया गया है, मैंने दो समाधानों को एक ही जवाब में जोड़ा है। –

+0

धन्यवाद, इससे एक गुच्छा में मदद मिली। अजीब आप सिर्फ 'didSet' ओवरराइड नहीं कर सकते हैं। जैसा कि मैंने पढ़ा है, सेब ने कुछ समय पहले 'डीडसेट' से संबंधित कुछ बग तय की थीं। मुझे लगता है कि उनके पास अभी भी 'didSet' के बारे में ठीक करने के लिए कई बग हैं। – Eendje

+0

मुझे नहीं लगता कि संपत्ति पर्यवेक्षकों को ओवरराइड करने की अनुमति किसी भी समय काम में होने की संभावना है ... – nhgrif

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