2015-02-21 10 views
11
में प्रारंभ दौरान उदाहरण विधि कॉलिंग

मैं स्विफ्ट के लिए नया हूँ और इस तरह एक उदाहरण विधि का उपयोग कर एक वस्तु के सदस्य चर को प्रारंभ करना चाहते हैं: init विधि मेंस्विफ्ट

class MyClass { 
    var x: String 
    var y: String 

    func createY() -> String { 
    self.y = self.x + "_test" // this computation could be much more complex 
    } 

    init(x: String) { 
    self.x = x 
    self.y = self.createY() 
    }  
} 

मूल रूप से, के बजाय इनलाइन किए जाने वाले सभी प्रवर्तन कोड , मैं y के प्रारंभिक विधि createY पर प्रारंभिक कोड निकालना चाहता हूं और init में इस उदाहरण विधि createY पर कॉल करें। हालांकि, स्विफ्ट संकलक (स्विफ्ट 1.2 Xcode 6.3 बीटा में संकलक) की शिकायत है: पहले

विधि कॉल 'xxx' में 'स्वयं' के उपयोग super.init प्रारंभ स्वयं

यहाँ 'xxx' है इंस्टेंस विधि का नाम (createY)।

मैं समझ सकता हूं कि स्विफ्ट कंपाइलर क्या शिकायत कर रहा है और संभावित समस्या जिसे वह संबोधित करना चाहता है। हालांकि, मुझे नहीं पता कि इसे कैसे ठीक किया जाए। init में प्रारंभिक कोड के अन्य उदाहरण विधि को कॉल करने के लिए स्विफ्ट में सही तरीका क्या होना चाहिए?

वर्तमान में, मैं चारों ओर काम के रूप में निम्नलिखित चाल का उपयोग लेकिन मुझे नहीं लगता कि यह इस समस्या का मुहावरेदार समाधान है (और इस समाधान का y की आवश्यकता है varlet जो मुझे भी असहज महसूस करता है के बजाय का उपयोग कर घोषित करने):

init(x: String) { 
    self.x = x 
    super.init() 
    self.y = createY() 
} 

कोई भी टिप्पणी की सराहना की जाती है। धन्यवाद।

उत्तर

9

createY() को वैश्विक या क्लास फ़ंक्शन में कनवर्ट करें जो x को तर्क के रूप में स्वीकार करता है और y देता है।

func createY(x: String) -> String { 
    return x + "_test" // this computation could be much more complex 
} 

फिर इसे सामान्य रूप से अपने init से कॉल करें।

class MyClass { 
    let x: String 
    let y: String 

    init(x: String) { 
    self.x = x 
    self.y = createY(x) 
    }  
} 
+0

उत्तर के लिए धन्यवाद, ऐसा लगता है कि मैं अभी भी घोषित करने के लिए है ' वाई '' चलो 'के बजाय' var 'का उपयोग कर रहे हैं भले ही मेरा' वाई 'चर अपरिवर्तनीय है? – nybon

+0

@nybon मैंने कक्षा के लिए कोड को यह दिखाने के लिए जोड़ा कि मेरा उपयोग करने के लिए 'createY() 'का अर्थ था। 'चलो ठीक होना चाहिए। –

1

उत्तर के रूप में here, एक वर्ग समारोह बनाएँ। मैंने पूरा कोड जोड़ा है।

class MyClass { 
    var x: String 
    var y: String 

    class func createY(x: String) -> String { 
     return x + "_test" // this computation could be much more complex 
    } 

    init(x: String) { 
     self.x = x 
     self.y = MyClass.createY(x) 
    }  
} 
1

मुझे लगता है कि ऐसा करने के लिए स्विफ्ट रास्ता परिकलित गुण के साथ है (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html)

संपादित

इसके बजाय सेट पर एक संपत्ति को संशोधित करने के एक समारोह को बुलाने की/मिलता है, आप उपयोग कर सकते हैं अभिकलन गुण:

class MyClass { 

    var x: String? 
    var y: String? { 
     get { 
      return "\(x!)_test" 
     } 
    } 

    init(x: String!){ 
     self.x = x 
    } 
} 

let myClass = MyClass(x: "string") 
print(myClass.y!) #=> "string_test" 
+0

आप केवल बाहरी पृष्ठ से लिंक करने के बजाय वास्तविक उदाहरण प्रदान करके अपना उत्तर सुधार सकते हैं (जो गायब हो सकता है)। – zeeMonkeez

+0

क्षमा करें, मैंने एक उदाहरण जोड़ा। – Struki84

+0

यदि मैं सही ढंग से समझता हूं, तो गणना की गई संपत्ति हर बार जब मैं इस गणना की गई संपत्ति तक पहुंचता हूं, तो क्या यह सही होगा? यदि गणना महंगा है और केवल प्रारंभ के दौरान एक बार आवश्यकता है, तो मुझे यह कैसे करना चाहिए? – nybon

0

स्विफ्ट 3 में, मैं इस पद्धति का उपयोग कर रहा हूँ,

012,
class MyClass { 
    var x: String? 
    private(set) lazy var y: String? = self.createY() 

    init(x: String){ self.x = x } 

    private func createY() -> String? 
    { 
    return "\(x ?? "nil") test" 
    } 
} 

यहां गुप्त सॉस private(set) lazy का उपयोग है। इस तरह, आप अपनी संपत्ति को var लेबल कर सकते हैं। और lazy आपके init फ़ंक्शन पूरा होने तक प्रारंभ में देरी करेगा। private(set) का उपयोग केवल lazy कीवर्ड समेत उस संपत्ति को संशोधित करने के लिए इस वर्ग के कार्यों को अनुमति देता है, लेकिन सार्वजनिक इंटरफेस को इसे बदलने की अनुमति नहीं देता है।बेशक, यदि आप अपनी इंटरफ़ेस को अपनी संपत्ति बदलना चाहते हैं, तो आप इसे internal (डिफ़ॉल्ट) या public भी चिह्नित कर सकते हैं। लेकिन आप इसे चिह्नित छोड़ने के लिए जरूरत है एक lazy var

0

आप

वर्ग MyClass इस दृष्टिकोण में उपयोग कर सकते हैं: NSObject {

 let x: String 
     var y: String 

     init(x: String) { 

      self.x = x 
      self.y = self.x + "_test" 
      print(self.x) 
      print(self.y) 
     } 
} 
+0

उत्तर के लिए धन्यवाद, लेकिन जैसा कि मैंने उपर्युक्त उल्लेख किया है, मैं इनलाइन विधि में सभी प्रारंभिक कोड को इनलाइन करना नहीं चाहता हूं। – nybon

0
class MyClass { 
     let x: String 
     lazy var y : String = { 
       return x + "_test" 
      }() 
     init(x: String) { 
      self.x = x 
     } 
} 
+1

किसी और स्पष्टीकरण के बिना वास्तव में उपयोगी नहीं है ;-( – GhostCat