Литье CGFloat для плавания в Swift

Мне нужно сохранить значение как Float, но исходными данными являются CGFloat:

let myFloat : Float = myRect.origin.x

но это приводит к ошибке компилятора: "NSNumber" не относится к подтипу "Float"

Итак, если я явно использую его следующим образом:

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

но это, в свою очередь, приводит к ошибке компилятора: "Невозможно преобразовать тип выражения" Float "в" Float "

Каков правильный способ сделать это и удовлетворить компилятор?

Ответ 1

Вы можете использовать инициализатор Float():

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

Ответ 2

Если вы так же ленивы, как и я, в Extensions.swift определите следующее:

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

Ответ 3

Обычно лучшим решением является сохранение типа и использование CGFloat, даже в Swift. Это потому, что CGFloat имеет разный размер на 32-битных и 64-битных машинах.

Ключевое слово as может использоваться только для динамического каста (для подклассов), например

class A {
}

class B : A {
}

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

Однако Double, Int, Float и т.д. не являются подклассами друг друга, поэтому для "cast" вам нужно создать новый экземпляр, например

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