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.