Swift'de Float için CGFloat Döküm


94

Bir değeri a olarak saklamam gerekiyor Float, ancak kaynak veriler a CGFloat:

let myFloat : Float = myRect.origin.x

ancak bu derleyici hatasıyla sonuçlanır: 'NSNumber', 'Float' alt tipinde değil

Öyleyse, bunu açıkça şu şekilde yayınlarsam:

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

ancak bu da derleyici hatasıyla sonuçlanır: 'İfadenin türü' Float ',' Float 'olarak dönüştürülemiyor.

Bunu yapmanın ve derleyiciyi tatmin etmenin doğru yolu nedir lütfen?


9
64-bit sistemlerde, CGFloat'ı Float'a çevirmenin hassasiyeti kaybettiğini unutmayın - CGFloat 64-bit sistemlerde 64 bit ve 32-bit sistemde 32 bit, Float her zaman 32 bittir. Bundan kaçınmak için Float yerine Double kullanabilirsiniz.
Lukas


Xcode'da bir CGFloat üzerinde detaya inerseniz ve nerede tanımlandığını görürseniz, bunun 32 bit mimaride bir float ve 64 bit mimaride bir çift olarak yazıldığını göreceksiniz.
jcpennypincher

Yanıtlar:


177

Float()Başlatıcıyı kullanabilirsiniz :

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

17
değişken adı olarak "float" kullanmak biraz kafa karıştırıcı olabilir, belki de değişiklik "swFloat" gibi bir şeydir?
Fermat'ın Küçük Öğrencisi

2
"'float' biraz kafa karıştırıcıdır". Ciddi anlamda?
AlvinfromDiaspar

2
@AlvinfromDiaspar Evet, büyük olasılıkla başka diller floatyerine kullandığından Float, değişken adı yerine tür / anahtar kelime gibi görünüyor.
Ben Leggiero

29

Benim kadar tembelseniz, Extensions.swift'te şunları tanımlayın:

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) }
}

O zaman şunları yapabilirsiniz:

var someCGFloatFromFloat = 1.3.f
var someCGFloatFromInt = 2.f
var someFloatFromCGFloat = someCGFloatFromFloat.swf

1
genel yapı adayı gibi görünüyor
μολὼν.λαβέ

@ Sorunuzu anlamıyorum ... bir örnek?
hyouuu

13

Genellikle en iyi çözüm, CGFloatSwift'de bile türü ve kullanımı korumaktır . Bunun nedeni CGFloat32bit ve 64bit makinelerde farklı boyutlara sahip olmasıdır.

Anahtar kelime asyalnızca dinamik döküm için kullanılabilir (alt sınıflar için), örn.

class A {
}

class B : A {
}

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

Ancak Double, Int, Floatvb Eğer, örneğin yeni bir örneğini oluşturmak zorunda değildir, bu nedenle "döküm" için birbirinden alt sınıfların vardır

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

asGenel bir türü somut bir türe dönüştürmek için de kullanabileceğinizi unutmayın . Örneğin, uygundur o genel bir tür kabul eden bir işlevi olsaydı BinaryInteger, sen yayınlayabilmek için Intkullanıyor as?ya as!.
Peter Schorn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.