स्विफ्ट में फ्लोट को सीजीफ्लोट कास्टिंग


91

मुझे एक मान के रूप में स्टोर करने की आवश्यकता है Float, लेकिन स्रोत डेटा एक है CGFloat:

let myFloat : Float = myRect.origin.x

लेकिन संकलक त्रुटि में यह परिणाम: 'NSNumber' उपप्रकार 'फ्लोट' का नहीं है

तो अगर मैं स्पष्ट रूप से इसे इस तरह से रखता हूं:

let myFloat : Float = myRect.origin.x as Float

लेकिन यह संकलक त्रुटि का परिणाम है: 'अभिव्यक्ति का प्रकार' फ्लोट 'को' फ्लोट 'में नहीं बदल सकता है

ऐसा करने का सही तरीका क्या है और कृपया कंपाइलर को संतुष्ट करें?


8
ज्ञात हो कि 64-बिट सिस्टम पर, फ्लोट में CGFloat को कास्टिंग सटीक खो देता है - CGFloat 64-बिट सिस्टम पर 64 बिट्स और 32-बिट सिस्टम पर 32 बिट्स है, फ्लोट हमेशा 32 बिट्स होता है। इससे बचने के लिए, आप फ्लोट के बजाय डबल का उपयोग कर सकते हैं।
लुकास


यदि आप Xcode में एक CGFloat पर ड्रिल करते हैं और देखें कि यह कहां परिभाषित है तो आप देखेंगे कि यह 32 बिट आर्किटेक्चर पर फ्लोट के रूप में और 64 बिट आर्किटेक्चर पर डबल है।
jcpennypincher

जवाबों:


173

आप Float()इनिशलाइज़र का उपयोग कर सकते हैं :

let cgFloat: CGFloat = 3.14159
let someFloat = Float(cgFloat)

17
चर नाम के रूप में "फ्लोट" का उपयोग करना कुछ हद तक भ्रामक है, शायद परिवर्तन "स्वफ़्लोट" की तरह कुछ है?
फ़र्मेटस लिटिल स्टूडेंट

2
"" फ्लोट 'कुछ भ्रामक है "। गंभीरता से?
एल्विनफ्रोमडायस्पर

2
@AlvinfromDiaspar हां, चूंकि अन्य भाषाओं के floatबजाय इसके उपयोग की संभावना है Float, इसलिए यह एक चर नाम के बजाय उस प्रकार / कीवर्ड की तरह दिखता है।
Supuhstar

29

यदि आप मेरे जैसे ही आलसी हैं, तो एक एक्सटेंशन्स में। निम्नलिखित को परिभाषित करें:

extension Int {
  var f: CGFloat { return CGFloat(self) }
}

extension Float {
  var f: CGFloat { return CGFloat(self) }
}

extension Double {
  var f: CGFloat { return CGFloat(self) }
}

extension CGFloat {
  var swf: Float { return Float(self) }
}

तो आप कर सकते हैं:

var someCGFloatFromFloat = 1.3.f
var someCGFloatFromInt = 2.f
var someFloatFromCGFloat = someCGFloatFromFloat.swf

1
जेनेरिक संरचना के लिए एक उम्मीदवार की तरह दिखता है
μολ.ν.λα

@ क्या मैं आपके प्रश्न को नहीं समझ सकता ... एक उदाहरण?
हाइउउ

13

आमतौर पर, सबसे अच्छा समाधान CGFloatस्विफ्ट में भी, प्रकार और उपयोग को बनाए रखना है । ऐसा इसलिए है क्योंकिCGFloat है 32 बिट और 64 बिट मशीनों पर अलग आकार है।

कीवर्ड asका उपयोग केवल डायनामिक कास्टिंग (उपवर्गों के लिए) के लिए किया जा सकता है, जैसे

class A {
}

class B : A {
}

var a: A = B()
var b: B = a as B

हालांकि, Double, Int, Floatआदि, एक दूसरे के नहीं उपवर्गों इसलिए "डाली" करने के लिए आप, उदाहरण के लिए एक नया उदाहरण बनाने के लिए कर रहे हैं

var d: Double = 2.0
var f: Float = Float(d) //this is an initialiser call, not a cast
var i: Int = Int(d) //this is an initialiser call, not a cast

ध्यान दें कि आप asसामान्य प्रकार में एक सामान्य प्रकार की ढलाई के लिए भी उपयोग कर सकते हैं । उदाहरण के लिए, यदि आपके पास एक फ़ंक्शन था जो एक सामान्य प्रकार को स्वीकार करता है जो इसके अनुरूप है BinaryInteger, तो आप इसे Intउपयोग करने के लिए डाल सकते हैं as?या as!
पीटर शोर्न
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.