在Ciftloat中使用CGFloat进行浮动

And*_*ing 87 casting cgfloat swift

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

let myFloat : Float = myRect.origin.x
Run Code Online (Sandbox Code Playgroud)

但这会导致编译器错误:'NSNumber'不属于子类型'Float'

所以如果我明确地这样做:

let myFloat : Float = myRect.origin.x as Float
Run Code Online (Sandbox Code Playgroud)

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

这样做的正确方法是什么,请满足编译器的要求?

Eri*_*rik 166

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

let cgFloat: CGFloat = 3.14159
let someFloat = Float(cgFloat)
Run Code Online (Sandbox Code Playgroud)

  • 使用"float"作为变量名有点令人困惑,或许更改为"swFloat"之类的东西? (16认同)
  • "'浮动'有点令人困惑".真的吗? (2认同)
  • @AlvinfromDiaspar 是的,可能是因为其他语言使用 `float` 而不是 `Float`,所以它看起来像那个类型/关键字而不是变量名。 (2认同)

hyo*_*uuu 28

如果你像我一样懒惰,在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) }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

var someCGFloatFromFloat = 1.3.f
var someCGFloatFromInt = 2.f
var someFloatFromCGFloat = someCGFloatFromFloat.swf
Run Code Online (Sandbox Code Playgroud)


Sul*_*han 13

通常,最好的解决方案是保持类型和使用CGFloat,即使在Swift中也是如此.那是因为CGFloat在32位和64位机器上有不同的尺寸.

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

class A {
}

class B : A {
}

var a: A = B()
var b: B = a as B
Run Code Online (Sandbox Code Playgroud)

然而Double,Int,Float等不是彼此的子类,因此,以"铸造"你必须创建一个新的实例,例如,

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
Run Code Online (Sandbox Code Playgroud)