2016-04-08 9 views
6

मैं अपनी कक्षा में BooleanLiteralConvertible समर्थन जोड़ने की कोशिश कर रहा हूं ताकि मैं इसे बुलियन के साथ तुरंत चालू कर सकूं। एक लूप के लिए मुझे फेंकने वाली चीज एक बूलियन वैल्यू और बूलियन शाब्दिक के बीच भेद है।स्विफ्ट बूलियन लिटरल कन्वर्टिबल को बूलियन शाब्दिक क्यों चाहिए?

उदाहरण के लिए, प्रोटोकॉल को जोड़ने के बाद मैं इस प्रयास किया:

func setSelected(value: Bool) { 
    var node: MyClass = value 
} 

लेकिन स्विफ्ट ने शिकायत की कि यह MyClass करने के लिए Bool परिवर्तित नहीं कर सकते। मुझे यह महसूस करने में थोड़ी देर लग गई कि इसे एक बूलियन शाब्दिक होना चाहिए। विचित्र रूप से पर्याप्त काम ठीक है:

func setSelected(value: Bool) { 
    var node: MyClass = value ? true : false 
} 

... जो मुझे बिल्कुल बिल्कुल मूर्खतापूर्ण लगता है। क्या यह प्रतीत होता है कि यह बहुत ही विचित्र आवश्यकता है?

+0

क्या आपने 'मूल्य 'का प्रयास किया था? – mattsven

+0

'value' पहले से ही एक गैर-वैकल्पिक 'बूल' है, मैं इसे'! 'लागू नहीं कर सकता। – devios1

उत्तर

2

मैं सवाल पसंद वस्तु को प्रारंभ करना होगा। केवल स्विफ्ट टीम निश्चित रूप से जवाब दे सकती है, लेकिन मैं अनुमान लगा सकता हूं कि क्यों: एक टाइप किए गए मान को एक अलग प्रकार के चर में परिवर्तित करने के बिना एक स्पष्ट रूपांतरण या कलाकार के बिना प्रोग्रामर त्रुटि के साथ भ्रमित करना बहुत आसान है, और कई मामलों में कुछ ऐसा है कंपाइलर के बारे में चेतावनी दी जानी चाहिए।

उदाहरण (और मान लेते हैं कि Person भी एक StringLiteralConvertible कि एक शाब्दिक और साथ ही एक स्ट्रिंग चर के साथ प्रारंभ किया जा सकता है के रूप में आप अपने प्रश्न में मुद्रा है):

struct Person { 

    private static var idCounter = 1 

    var name:String 
    let id:Int 

    init(withName name:String) { 
     Person.idCounter += 1 
     self.name = name 
     self.id = Person.idCounter 
    } 
} 

var person = Person(withName:"Mary") 
let name = "John" 
person = name 

ऊपर कोड एक गलती की तरह संदेह से लग रहा है , जहां प्रोग्रामर Person प्रकार के चर के लिए गलत प्रकार (String) का मान असाइन कर रहा है। यह वास्तव में एक गलती हो सकती है। हो सकता है कि प्रोग्रामर केवल नाम व्यक्ति (person.name = name) को एक नया अद्वितीय आईडी के साथ एक नया Person बनाने के बिना बदलना चाहता था। या हो सकता है कि प्रोग्रामर person पर कुछ अन्य मान असाइन करने का इरादा रखता है लेकिन एक टाइपो या कोड पूर्णता त्रुटि बना देता है। मूल प्रोग्रामर होने के बिना बताना मुश्किल है, या यह देखने के लिए सावधानी से सभी संदर्भों का अध्ययन करना है कि यह रूपांतरण समझ में आता है या नहीं। और यह अधिक कठिन हो जाता है कि असाइनमेंट उस स्थान से है जहां चर मूल रूप से प्रारंभ किए गए हैं क्या संकलक यहां चेतावनी देता है कि String प्रकार का मान Person प्रकार के चर के लिए असाइन किया जा रहा है?

उदाहरण कहीं अधिक स्पष्ट है, और अधिक लाइन में के रूप में स्विफ्ट परंपराओं से होगा:

var person = Person(withName:"Mary") 
let name = "John" 
person = Person(withName:name) 

ऊपर संस्करण दोनों संकलक करने के लिए और किसी भी अन्य प्रोग्रामर जो बाद में इस पढ़ने के लिए, पूरी तरह से स्पष्ट है।

+0

वैसे यह एक बिंदु पर स्पष्ट रूप से व्यक्तिपरक है। मेरा मतलब है, अगर आप कोड पठनीयता के बारे में चिंतित हैं तो हमें पहले स्थान पर शाब्दिक कन्वर्टिबल्स की आवश्यकता क्यों है? 'व्यक्ति =" बॉब "मुझे 'व्यक्ति' नाम के रूप में" गलत "जैसा लगता है, लेकिन यदि आप एक को अनुमति देते हैं, तो दूसरा क्यों नहीं? व्यक्तिगत रूप से मैं इस वाक्य का उपयोग अपने वाक्यविन्यास को लिखने के लिए अधिक संक्षिप्त और आसान बनाने के साधन के रूप में करना चाहता था। लगातार प्रारंभकर्ता को कॉल करना सिर्फ बॉयलरप्लेट जैसा लगता है जिसे अंतर्निहित रूपांतरण से बचा जा सकता है। यह अभी भी स्थिर रूप से वैध और संकलित-समय सुरक्षित है, भले ही यह * परिचित * न लगे। – devios1

+0

वास्तव में, इस प्रतिबंध को पेश करके, भाषा वास्तव में एक शाब्दिक मूल्य के उपयोग और उसी प्रकार के चर के उपयोग के बीच एक बहुत ही मजबूत अर्थपूर्ण अंतर बनाती है, जहां अधिकांश भाषाओं में ये मौलिक स्तर पर पूरी तरह से अदलाबदल योग्य होते हैं । मेरे लिए यह * गलत * दिशा में एक कदम की तरह लगता है, मूल्यों और प्रकारों की वैचारिक समझ में शाखा बिंदु बना रहा है और भाषा को अनावश्यक रूप से जटिल करता है। – devios1

+0

@devios मुझे लगता है कि आप अच्छे अंक लाते हैं। एक शाब्दिक नोटेशन और वास्तविक टाइप किए गए मान के बीच _huge_ अंतर नहीं है, लेकिन कुछ ऐसे जोड़े हैं जिन पर मैं सोच सकता हूं: 1) प्रारंभिक साइट पर मूल्य निर्दिष्ट करने वाले शाब्दिक नोटेशन बल, उदा। 'चीज =' फू '' की बजाय 'चीज़ = someStringValueWeDontKnow' जो शाब्दिक बनाता है थोड़ा अस्पष्ट और गलती-प्रवण –

6

प्रकार BooleanLiteralConvertible के अनुरूप बूलियन शाब्दिकtrue और false, उदा प्रारंभ किया जा सकता है

let mc : MyClass = true 

यह एक बूलियन मूल्य के साथ प्रकार आरंभ के साथ कोई संबंध नहीं है:

let value : Bool = // ... some boolean value 
let mc : MyClass = value // error: cannot convert value of type 'Bool' to specified type 'MyClass' 

और है - इस तरह के एक अंतर्निहित रूपांतरण काम करने के लिए कोई रास्ता नहीं है - के रूप में तक मुझे पता है । आप एक कस्टम init विधि

init(bool : Bool) { 
    // ... 
} 

लिख सकते हैं और के रूप में

let value : Bool = // ... some boolean value 
let mc = MyClass(bool: value) 
+0

स्विफ्ट के द्विध्रुवीय विकार, इमो का एक और उदाहरण। ;) कभी-कभी स्विफ्ट की शक्ति कुछ संक्षिप्त और सुरुचिपूर्ण वाक्यविन्यास को उधार देती है। अन्य बार यह आपको ऐसी चीजें करता है जो शौकिया क्रिंग कर देगा। – devios1

+1

@devios: प्रारंभिक स्विफ्ट रिलीज में आप मनमाना प्रकारों से अपने प्रकार के लिए निहित रूपांतरण विधियों को लागू कर सकते हैं। उस सुविधा को बाद में हटा दिया गया था, लेकिन मुझे तर्क याद नहीं है। –

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