98

我需要将值存储为 a Float,但源数据是 a CGFloat

let myFloat : Float = myRect.origin.x

但这会导致编译器错误:“NSNumber”不是子类型“Float”

因此,如果我像这样明确地转换它:

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

但这反过来会导致编译器错误:'无法将表达式的类型'Float'转换为'Float''

请问这样做并满足编译器的正确方法是什么?

4

3 回答 3

185

您可以使用Float()初始化程序:

let cgFloat: CGFloat = 3.14159
let someFloat = Float(cgFloat)
于 2014-06-10T17:47:21.227 回答
31

如果您像我一样懒惰,请在 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
于 2014-11-09T16:47:46.523 回答
13

通常,最好的解决方案是保留 type 和 use CGFloat,即使在 Swift 中也是如此。那是因为CGFloat32 位和 64 位机器上的大小不同。

关键字as只能用于动态转换(用于子类),例如

class A {
}

class B : A {
}

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

但是,,Double等不是彼此的子类,因此要“强制转换”,您必须创建一个新实例,例如IntFloat

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
于 2014-06-10T18:04:08.640 回答