簡體   English   中英

在Ciftloat中使用CGFloat進行浮動

[英]Casting CGFloat to Float in Swift

我需要將值存儲為Float ,但源數據是CGFloat

let myFloat : Float = myRect.origin.x

但這會導致編譯器錯誤:'NSNumber'不屬於子類型'Float'

所以,如果我明確地這樣做:

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

但這反過來導致編譯器錯誤:'無法將表達式的類型'Float'轉換為'Float''

這樣做的正確方法是什么,請滿足編譯器的要求?

您可以使用Float()初始值設定項:

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

如果你像我一樣懶惰,在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

通常,最好的解決方案是保持類型並使用CGFloat ,即使在Swift中也是如此。 那是因為CGFloat在32位和64位機器上有不同的尺寸。

關鍵字as只能用於動態轉換(對於子類),例如

class A {
}

class B : A {
}

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

但是, DoubleIntFloat等不是彼此的子類,因此要“強制轉換”你必須創建一個新實例,例如

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM