সুইফটে সিজিফ্লোটকে ফ্লোটে কাস্ট করা


94

আমার একটি হিসাবে একটি মান সঞ্চয় করতে হবে Floatতবে উত্স ডেটা হ'ল CGFloat:

let myFloat : Float = myRect.origin.x

তবে এটি সংকলক ত্রুটির ফলস্বরূপ: 'এনএসএনম্বার' সাব টাইপ 'ফ্লোট' নয়

সুতরাং আমি যদি স্পষ্টভাবে এটিকে castালাই করি:

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

তবে এর পরিবর্তে সংকলক ত্রুটির ফলস্বরূপ: 'এক্সপ্রেশনটির ধরণ' ফ্লোট 'কে' ফ্লোট 'তে রূপান্তর করতে পারে না

এটি করার এবং সংকলক সন্তুষ্ট করার সঠিক উপায় কি?


9
সচেতন থাকুন যে 64৪-বিট সিস্টেমে সিজিফ্লোট থেকে ফ্লোটে কাস্টিং যথাযথতা হারাবে - সিজিফ্লোট 64৪ বিট সিস্টেমে b৪ বিট এবং 32 বিট সিস্টেমে 32 বিট, ফ্লোট সবসময় 32 বিট থাকে। এটি এড়াতে আপনি ফ্লোটের পরিবর্তে ডাবল ব্যবহার করতে পারেন।
লুকাশ


আপনি যদি এক্সকোডের কোনও সিজিফ্লোয়েটে ড্রিল করেন এবং এটি কোথায় সংজ্ঞায়িত করা হয় তা আপনি দেখতে পাবেন যে এটি 32 বিট আর্কিটেকচারে একটি ফ্লোট এবং 64 বিট আর্কিটেকচারে একটি ডাবল হিসাবে টাইপড হয়েছে is
jcpennypincher

উত্তর:


176

আপনি Float()আরম্ভকারীটি ব্যবহার করতে পারেন :

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

17
"ভাসমান" পরিবর্তনশীল নাম হিসাবে ব্যবহার করা কিছুটা বিভ্রান্তিকর, সম্ভবত "swFloat" এর মতো কোনও কিছুর পরিবর্তন?
ফারম্যাটের ছোট্ট শিক্ষার্থী

4
"'ভাসা' কিছুটা বিভ্রান্তিকর" " সিরিয়াসলি?
অ্যালভিনফ্রমডিস্পার

4
@ অ্যালভিনফ্রমডিয়াস্পার হ্যাঁ, সম্ভবত যেহেতু অন্যান্য ভাষাগুলি floatপরিবর্তে অন্য ভাষা ব্যবহার করে Float, সুতরাং এটি ভেরিয়েবল নামের পরিবর্তে টাইপ / কীওয়ার্ডের মতো দেখাচ্ছে।
সুপহস্তর

29

আপনি যদি আমার মতো অলস হন তবে কোনও এক্সটেনশনে s সুইচটি নিম্নলিখিতটি সংজ্ঞায়িত করুন:

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

4
জেনেরিক স্ট্রাক্টের প্রার্থীর মতো দেখাচ্ছে
λαβέ.

@ আমি আপনার প্রশ্নটি বুঝতে পারি না ... উদাহরণ?
hyouuu

13

সাধারণত, সবচেয়ে ভাল সমাধান হ'ল টাইপ এবং ব্যবহার রাখা CGFloat, এমনকি সুইফটে। এটি কারণ CGFloat32 বিট এবং 64 বিট মেশিনে ভিন্ন আকার রয়েছে।

কীওয়ার্ডটি asকেবল গতিশীল castালাইয়ের জন্য (উপশ্রেণীর জন্য) ব্যবহৃত যেতে পারে, যেমন

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!
পিটার শোর্ন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.