2015-03-02 13 views
8

मैंने अभी देखा है कि स्विफ्ट इंट और डबल पर कुछ प्रकार का कास्टिंग करता है। जब मैं मूल्यांकन करने के लिएअजीब स्विफ्ट नंबर प्रकार कास्टिंग

(10/3.0) - (10/3) 

0.333... की उम्मीद है की कोशिश, लेकिन यह वास्तव 0.0 है। क्या कोई इसे समझा सकता है?

उत्तर

12

हां, मुझे यह आश्चर्यजनक भी मिला। Double स्विफ्ट 3 में FloatLiteralConvertible और IntegerLiteralConvertible (ExpressibleByFloatLiteral और ExpressibleByIntegerLiteral दोनों के अनुरूप है)। इसलिए एक Doubleचल बिन्दु शाब्दिक साथ प्रारंभ किया जा सकता है

let a = 3.0 

या एक पूर्णांक शाब्दिक साथ:

let b : Double = 10 

(एक ही Float और CGFloat जैसे अन्य चल बिन्दु प्रकार के लिए सच है ।)

अब यह अप्रत्याशित हो सकता है कि दोनों बयान

एक (Objective-) सी पृष्ठभूमि के साथ हम सभी के लिए
let x : Double = 10/4  // x = 2.5 . Really? Yes! 
let y = 10/4 as Double // Same here ... 

चर के मूल्य 0.25 आवंटित। संदर्भ से, विभाजन का परिणाम Double होना चाहिए और स्विफ्ट निश्चित रूप से प्रकारों को परिवर्तित नहीं करता है। इसलिए / चल बिन्दु विभाजन ऑपरेटर

func /(lhs: Double, rhs: Double) -> Double 

तो संकलक शाब्दिक "10" और "4" से Double रों के रूप में दोनों बहस पैदा होना चाहिए। (यदि 10/4 दो पूर्णांकों के विभाजन के रूप में व्यवहार किया गया तो परिणाम भी एक पूर्णांक होना होता है, और है कि एक Double को नहीं सौंपा जा सकता है।)

ध्यान दें कि यह से

let z = Double(10/4) // z = 2.0 . (I just thought that I understood it &%$!?) 

अलग है जो एक पूर्णांक विभाजन करता है और परिणाम को Double में परिवर्तित करता है। Double में init(_ v: Int) कन्स्ट्रक्टर है, और इसलिए 10/4 को यहां दो पूर्णांक के विभाजन के रूप में माना जा सकता है।,

let x : Double = 10/4  // x = 2.5 
let y = 10/4 as Double // y = 2.5 
let z = Double(10/4)  // z = 2.0 

अब हम आपकी अभिव्यक्ति

(10/3.0) - (10/3) 

पहले भाग (10/3.0) को इन परिणामों आवेदन कर सकते हैं केवल एक Double हो सकता है इसलिए:

यह वास्तव में अगर हम इन परिणामों को संक्षेप में थोड़ा अजीब लग रहा है - फ़्लोटिंग पॉइंट घटाव ऑपरेटर

func -(lhs: Double, rhs: Double) -> Double 
होना चाहिए

और इस प्रकार (10/3) भी Double होना चाहिए। दोबारा, / फ़्लोटिंग पॉइंट डिवीजन ऑपरेटर होना चाहिए, इसलिए 10 और 3 को Double स्थिरांक माना जाता है।

इसलिए अभिव्यक्ति

(Double(10)/3.0) - (Double(10)/Double(3)) 

के बराबर है और 0.0 मूल्यांकन करता है। आप

(10/3.0) - Double(10/3) 

को अभिव्यक्ति को बदलते हैं तो परिणाम 0.333... क्योंकि इस संदर्भ में, 10/3 , दो पूर्णांक स्थिरांक की प्रभाग है जैसा कि ऊपर बताया है।

+2

ग्रेट स्पष्टीकरण! –

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