2014-08-30 5 views
14

में कस्टम प्रकारों के लिए स्पष्ट रूपांतरण परिभाषित करना स्विफ्ट में स्पष्ट रूपांतरणों को परिभाषित करने के लिए वर्तमान में सबसे अच्छा/पसंदीदा तरीका क्या है? मेरे सिर के ऊपर से मैं दो के बारे में सोच सकते हैं:स्विफ्ट

  • एक विस्तार के माध्यम से गंतव्य प्रकार के लिए कस्टम initializers बनाना, इस तरह:

    extension String { 
        init(_ myType: MyType) { 
        self = "Some Value" 
        } 
    } 
    

    इस तरह, आप बस String(m) इस्तेमाल कर सकते हैं जहां मीटर एम को स्ट्रिंग में कनवर्ट करने के लिए MyType टाइप करें।

  • , स्रोत प्रकार में toType -Methods परिभाषित इस तरह:

    class MyType { 
        func toString() -> String { 
        return "Some Value" 
        } 
    } 
    

    यह स्विफ्ट String.toInt() है, जो एक Int? रिटर्न के बराबर है। लेकिन अगर यह जाने का एक निश्चित तरीका था, तो मैं इसके लिए बुनियादी प्रकारों के लिए प्रोटोकॉल होने की अपेक्षा करता हूं, जैसे पहले से मौजूद *LiteralConvertible प्रोटोकॉल का उलटा।

उप-प्रश्न: दो विधियों में से कोई भी कुछ इस तरह संकलित करने के लिए अनुमति देते हैं: let s: MyString = myTypeInstance (as String) (वैकल्पिक कोष्ठक में भाग), लेकिन अगर मैं सही समझ, as ऑपरेटर ही प्रकार पदानुक्रम के भीतर downcasting के लिए है, कि है सही बात?

उत्तर

9

स्विफ्ट में उपयोग किया जाने वाला पैटर्न प्रारंभकर्ता है।

var i: Int = 10 
var u: UInt = UInt(i) 

मुझे लगता है कि पैटर्न के साथ चिपके रहते हैं होगा: तो उदाहरण के लिए जब UInt के लिए एक Int परिवर्तित, हम लिखने के लिए की है।

subquestion का सवाल है, प्रलेखन कहा गया है कि:

Type casting is a way to check the type of an instance, and/or to treat that instance as if it is a different superclass or subclass from somewhere else in its own class hierarchy.

और

You can also use type casting to check whether a type conforms to a protocol

इसलिए कोई, as कीवर्ड दूसरे करने के लिए एक खास प्रकार के एक मूल्य को बदलने के लिए इस्तेमाल किया जा नहीं कर सकते प्रकार।

एक सरल तरीके से परीक्षण किया जा सकता है कि:

var i: Int = 10 
var u: UInt = i as UInt 

वह एक त्रुटि उत्पन्न करता है:

'Int' is not convertible to 'UInt' 

अधिक Type Casting के बारे में

+0

ठीक है, धन्यवाद। दस्तावेज शामिल करने के लिए आप में भी अच्छा लगा। मैं इसे लेता हूं कि रूपांतरण के लिए अंतर्निहित प्रकारों के लिए एक्सटेंशन प्रदान करना भी सही काम है? – Kolja

+1

हां, एक्सटेंशन हमारे हाथों में उपकरण है जब हम तृतीय पक्ष प्रकारों में जोड़ रहे हैं। अपने कोड के लिए, यह सिर्फ पाठ्यक्रम की वरीयता का मामला है। कुछ मामलों में एक्सटेंशन का उपयोग करके हमारे कोड को ब्राउज़ करने में अधिक व्यवस्थित और आसान रखने में मदद मिल सकती है। – Antonio

+1

फिर से धन्यवाद। अब मुझे कुछ मामलों के लिए निहित रूपांतरण की आवश्यकता है जहां यह समझ में आता है, लेकिन मुझे स्विफ्ट से नहीं मिलेगा। ;-) – Kolja