Литье CGFloat плавать в Swift


мне нужно сохранить значение как Float, но исходные данные-это CGFloat:

let myFloat : Float = myRect.origin.x

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

так что если я явно бросил его так:

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

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

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

3 80

3 ответа:

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

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

Если вы так же ленивы, как и я, в расширениях.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

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

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

class A {
}

class B : A {
}

var a: A = B()
var b: B = a as B
, Double,Int,Float etc не являются подклассами друг друга, поэтому для "приведения" вам нужно создать новый экземпляр, например
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