Muszę zapisać wartość jako a Float
, ale dane źródłowe to CGFloat
:
let myFloat : Float = myRect.origin.x
ale skutkuje to błędem kompilatora: „NSNumber” nie jest podtypu „Float”
Więc jeśli wyraźnie rzucę to w ten sposób:
let myFloat : Float = myRect.origin.x as Float
ale to z kolei powoduje błąd kompilatora: „Nie można przekonwertować typu wyrażenia„ Float ”na„ Float ””
Jaki jest właściwy sposób, aby to zrobić i zadowolić kompilatora?
Odpowiedzi:
Możesz użyć
Float()
inicjatora:let cgFloat: CGFloat = 3.14159 let someFloat = Float(cgFloat)
źródło
float
zamiastFloat
, więc zamiast nazwy zmiennej wygląda to jak ten typ / słowo kluczowe.Jeśli jesteś tak leniwy jak ja, w Extensions.swift zdefiniuj następujące elementy:
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) } }
Następnie możesz:
var someCGFloatFromFloat = 1.3.f var someCGFloatFromInt = 2.f var someFloatFromCGFloat = someCGFloatFromFloat.swf
źródło
Zwykle najlepszym rozwiązaniem jest zachowanie typu i użycia
CGFloat
, nawet w Swift. To dlatego, żeCGFloat
ma inny rozmiar na komputerach 32-bitowych i 64-bitowych.Słowo kluczowe
as
może być używane tylko do rzutowania dynamicznego (dla podklas), npclass A { } class B : A { } var a: A = B() var b: B = a as B
Jednak
Double
,Int
,Float
etc nie są podklasy siebie, więc do „obsady” trzeba utworzyć nową instancję, npvar 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
źródło
as
do rzutowania typu ogólnego na typ konkretny. Na przykład, jeśli masz funkcję, która akceptuje typ ogólny, który jest zgodny zBinaryInteger
, możesz rzutować ją naInt
użycieas?
lubas!
.