2016-01-11 2 views
17

अगर मैं कोई init साथ एक तेज struct बनाने के लिए, तो मैं संकलक उत्पन्न डिफ़ॉल्ट सदस्य वार initialiser, इसलिए की तरह कॉल कर सकते हैं:स्विफ्ट - मैं अपने कस्टम init विधि से एक struct डिफ़ॉल्ट सदस्य वार init कॉल कर सकते हैं?

struct OrderFill { 
    let price:Int 
    let qty: Int 
    let timeStamp: NSDate 
} 
let o = OrderFill(price: 2, qty: 1, timeStamp: someDate) 

मुझे क्या करना चाहते हैं से deserialise करने के लिए एक सुविधा init विधि बनाने है एक शब्दकोश, जो तब डिफ़ॉल्ट सदस्यवृत्ति init को चेन करता है।

struct OrderFill { 
    let price:Int 
    let qty: Int 
    let timeStamp: NSDate 

    init(dict:[String:AnyObject]) throws { 
     self.init(
      price: dict["price"] as! Int 
      qty: dict["qty"] as! Int 
      timeStamp: try parseDate(dict["ts"] as! String) 
    } 
} 
let o = OrderFill(someDict) 

मुझे इस कोड हालांकि संकलक (Xcode 7.2) लिखते हैं, की कोशिश की तरह मुझे कुछ "कॉल में अतिरिक्त तर्क 'मात्रा' 'के रूप में हालांकि यह डिफ़ॉल्ट सदस्य वार नहीं देखता त्रुटि देता है और करने के लिए कोशिश कर रहा है रिकर्सिव कॉल init(dictionary)

मैं अपना स्वयं का सदस्यवाही init लिख सकता हूं, या मैं सीधे अपने init(dictionary) से गुणों को असाइन कर सकता हूं, लेकिन अगर मैं कॉल कर सकता तो यह अच्छा होगा। क्या यह तेजी से करने का कोई तरीका है?

उत्तर

40

अपने struct के लिए एक विस्तार के रूप में अपने स्वयं के प्रारंभकर्ता जोड़ें। एक्सटेंशन मौजूदा कार्यक्षमताओं को हटा नहीं सकते हैं, इसलिए यह संरचना के डिफ़ॉल्ट प्रारंभकर्ता को संरक्षित रखेगा।

struct OrderFill { 
    let price: Int 
    let qty: Int 
    let timeStamp: NSDate 
} 

extension OrderFill { 

    init(dict: [String: AnyObject]) throws { 
     self.init(
      price: dict["price"] as! Int, 
      qty: dict["qty"] as! Int, 
      timeStamp: try parseDate(dict["ts"] as! String) 
     ) 
    } 
} 

let o = OrderFill(someDict) 
+2

इस तरह की hacky है, लेकिन वास्तव में काम करता है ...: हे – luk2302

+2

hacky लग सकता है, लेकिन यह किताब में भी है ... '' 'नोट आप अपने कस्टम मान प्रकार के साथ initializable होना चाहते हैं डिफ़ॉल्ट प्रारंभकर्ता और सदस्यवा प्रारंभिक, और अपने स्वयं के कस्टम प्रारंभकर्ताओं के साथ, मूल्य प्रकार के मूल कार्यान्वयन के हिस्से के बजाय अपने कस्टम प्रारंभकर्ताओं को एक्सटेंशन में लिखें। अधिक जानकारी के लिए, एक्सटेंशन देखें।''' – rob5408

5

the apple docs about Initialization से: अगर वे अपने स्वयं के कस्टम initializers

और

ध्यान दें कि के किसी भी परिभाषित नहीं करते

संरचना प्रकार स्वचालित रूप से एक सदस्य वार प्रारंभकर्ता प्राप्त करता है, तो आप एक को परिभाषित एक मूल्य के प्रकार के लिए कस्टम प्रारंभकर्ता, आप अब (या सदस्य वार प्रारंभकर्ता अगर यह एक संरचना है) डिफ़ॉल्ट प्रारंभकर्ता के लिए उपयोग होगा के लिए उस प्रकार। इस बाधा एक स्थिति है जिसमें अतिरिक्त आवश्यक एक अधिक जटिल प्रारंभकर्ता में प्रदान किए गए सेटअप कोई भूलवश इसके बजाय स्वचालित initializers से एक का उपयोग कर रोका जाता है रोकता है।

इसलिए जवाब नहीं है। आप एक कस्टम प्रारंभकर्ता और एक ही समय में सदस्य वार प्रारंभकर्ता का उपयोग प्रदान नहीं कर सकते।

यह वर्तमान सदस्य वार प्रारंभकर्ता की क्षमताओं का विस्तार के बारे में बात करती है this swift evolution proposal तरह लगता है। लेकिन निश्चित रूप से यह अभी तक बाहर नहीं है, फिर भी आप वर्तमान स्थिति की सीमाओं के बारे में कुछ सीखने के लिए एक नज़र डाल सकते हैं।

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