Saya perlu menyimpan nilai sebagai Float
, tetapi sumber datanya adalah CGFloat
:
let myFloat : Float = myRect.origin.x
tetapi ini menghasilkan kesalahan penyusun: 'NSNumber' bukan subtipe 'Float'
Jadi jika saya secara eksplisit menampilkannya seperti ini:
let myFloat : Float = myRect.origin.x as Float
tetapi ini pada gilirannya menghasilkan kesalahan penyusun: 'Tidak dapat mengubah jenis ekspresi' Float 'menjadi' Float ''
Apa cara yang benar untuk melakukan ini dan memuaskan kompilator?
Jawaban:
Anda dapat menggunakan
Float()
penginisialisasi:let cgFloat: CGFloat = 3.14159 let someFloat = Float(cgFloat)
sumber
float
alih-alihFloat
, jadi sepertinya jenis / kata kunci itu bukan nama variabel.Jika Anda malas seperti saya, dalam Extensions.swift tentukan yang berikut:
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) } }
Kemudian Anda dapat melakukan:
var someCGFloatFromFloat = 1.3.f var someCGFloatFromInt = 2.f var someFloatFromCGFloat = someCGFloatFromFloat.swf
sumber
Biasanya, solusi terbaik adalah mempertahankan jenis dan penggunaannya
CGFloat
, bahkan di Swift. Itu karenaCGFloat
memiliki ukuran yang berbeda pada mesin 32bit dan 64bit.Kata kunci hanya
as
dapat digunakan untuk casting dinamis (untuk subclass), misclass A { } class B : A { } var a: A = B() var b: B = a as B
Namun,
Double
,Int
,Float
dll tidak subclass satu sama lain, oleh karena itu untuk "pemain" Anda harus membuat contoh baru, misalnyavar 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
sumber
as
untuk menuang tipe generik menjadi tipe beton. Misalnya, jika Anda memiliki fungsi yang menerima tipe generik yang sesuaiBinaryInteger
, Anda dapat mentransmisikannya keInt
menggunakanas?
atauas!
.