2014-10-03 11 views
22

यह स्विफ्ट में मान्य कोड है:स्विफ्ट शून्य का एक संख्यात्मक मूल्य है?

println(nil < 1) 

और उत्पादन वैसे ही सच हो जाएगा,

println(nil > 1) 

झूठी हो जाएगा (संख्या 1 मनमाना है, आप -1 के लिए भी ऐसा ही कर सकते हैं और शायद कुछ और)। कारण मैं पूछता हूं क्योंकि मैंने कुछ कोड देखा है जो "some_string".toInt() को एक संख्यात्मक मान से तुलना करने की कोशिश करता है और यह संकलित होता है, जो toInt() परपर विचार करता है।

मेरा सवाल है, क्या यह स्विफ्ट में वैध वाक्यविन्यास होना चाहिए? यदि हां, तो शून्य का संख्यात्मक मूल्य क्या है?


स्विफ्ट 3.0 अपडेट:

ऐसा लगता है कि स्विफ्ट विकास removing the optional comparison operators करके इस समस्या को घेरने की कोशिश की। स्विफ्ट 3.0 में यह अब कोई मुद्दा नहीं है क्योंकि यह संकलित नहीं है।

+2

यह मेरे लिए एक बग जैसा दिखता है। –

+0

इंटेल के रूप में Int.min? > शून्य '$ R14: बूल = सत्य 'शायद यह आपको दो' Int? 'और' Int.min> nil' की तुलना करने की अनुमति देने के लिए संकलित त्रुटि –

+0

@ ब्रायन चेन यह निश्चित रूप से दिलचस्प है। मैं निश्चित रूप से इस संदर्भ में एक बग कहूंगा लेकिन मैं वास्तव में जानना चाहता हूं कि यह इस निष्कर्ष पर कैसे पहुंच रहा है। –

उत्तर

17

मुझे विश्वास है कि क्या हो रहा है यह है कि शाब्दिक 1 पर nil की तुलना में टाइप किया जा रहा है। उन लोगों के लिए जिन्हें स्विफ्ट के लिए उपयोग नहीं किया जाता है, मैं थोड़ा और समझाऊंगा। स्विफ्ट में "विकल्प" नामक एक अवधारणा है, जिसका मूल्य हो सकता है या nil हो सकता है। (हास्केल से परिचित किसी के लिए, यह मूल रूप से Maybe मोनैड है।) nil को एक वेरिएबल को असाइन करना अवैध है जिसे स्पष्ट रूप से वैकल्पिक रूप से परिभाषित नहीं किया गया था, इसलिए let i: Int = nil संकलक द्वारा अस्वीकार कर दिया जाएगा। यह कई फायदों की अनुमति देता है जो इस उत्तर के दायरे से बाहर हैं, और यह करने के लिए यह एक चालाक तरीका है।

यहाँ क्या हो रहा है, हालांकि, कि शाब्दिक 1 कई प्रकार की कोई मान्य मान है: आदि आदि आदि Int, Int32, Int64, UInt32, UInt64,,, और यह भी की कोई मान्य मान है उन प्रकार के वैकल्पिक संस्करणों: Int?, Int32?, आदि

तो जब स्विफ्ट संकलक एक शाब्दिक मूल्य और nil के बीच तुलना को देखता है, यह एक प्रकार है कि इन दोनों के मूल्यों के लिए मान्य होगा खोजने की कोशिश करता। 1Int? प्रकार का वैध मान है, और nil भी Int? प्रकार का मान्य मान है, इसलिए यह तुलना हस्ताक्षर (Int?, Int?) -> Bool के साथ तुलना ऑपरेटर लागू करता है। (यह तुलना ऑपरेटर है जो दो Int? मान लेता है और Bool देता है)। उस ऑपरेटर के नियमों का कहना है कि nil मूल्य किसी और चीज़ से भी कम क्रमबद्ध हैं, यहां तक ​​कि Int.min, और इसलिए आप ओपी के प्रश्न में परिणाम देख सकते हैं।

+1

संयोग से, यह हास्केल (जैसा कि मैं इसे समझता हूं) में संभव नहीं होगा, क्योंकि 'हो सकता है' मोनड को दो संभावित मानों के रूप में परिभाषित किया गया है: या तो 'कुछ भी नहीं' या 'बस x' (जहां 'x' किसी का हो सकता है प्रकार)। और चूंकि 'x' को कभी भी' जस्ट एक्स 'में कभी भी प्रचारित नहीं किया जा सकता है, इसलिए हास्केल कंपाइलर एक तुलना ऑपरेटर दिया जाएगा जो' शायद इंट 'और' हो सकता है 'प्रकार की तुलना करता है, '1' और' कुछ भी नहीं 'के बीच किसी भी तुलना को रोकता है , क्योंकि पूर्व 'Int' प्रकार का है और 'Int' और' शायद Int' की तुलना करने के लिए कोई ऑपरेटर नहीं है। (लेकिन 'बस 1' और' कुछ भी नहीं 'की तुलना करना वैध होगा: दोनों प्रकार के' शायद Int') हैं। – rmunn

+0

मेरी पिछली टिप्पणी में मूलभूत में सुधार: 'कुछ भी नहीं' मूल्य 'शायद x' है, जहां 'x' किसी भी प्रकार का हो सकता है। लेकिन यह 'शायद Int' प्रकार से मेल खाता है, इसलिए तुलना मान्य होगी। – rmunn

+7

'<' ऑपरेटर के हस्ताक्षरों में से एक है: 'func << टी: _Comparable> (lhs: टी ?, rhs: टी?) -> बूल'; मेरा मानना ​​है कि यह कहां से आ रहा है। एक त्वरित परीक्षण समारोह लिखना: 'func test <टी: तुलनात्मक> (lhs: टी ?, rhs: टी?) 'और' परीक्षण (शून्य, 1) 'काम कॉलिंग। कॉलिंग 'println (_stdlib_getDemangledTypeName (rhs))' उस फ़ंक्शन के अंदर 'स्विफ्ट। वैकल्पिक' प्रिंट करता है; कॉलिंग 'println (_stdlib_getDemangledTypeName (rhs!))' प्रिंट 'स्विफ्ट। INT'। तो, 'rhs', जिसे कॉल में '1' के रूप में पारित किया गया था वह' Int' है। –

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