Swift에서 CGFloat를 Float로 캐스팅


91

값을로 저장해야 Float하지만 소스 데이터는 다음과 CGFloat같습니다.

let myFloat : Float = myRect.origin.x

그러나 이로 인해 컴파일러 오류가 발생합니다. 'NSNumber'는 'Float'하위 유형이 아닙니다.

따라서 다음과 같이 명시 적으로 캐스팅하면 :

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

그러나 이로 인해 컴파일러 오류가 발생합니다. '식의 유형'Float '를'Float '로 변환 할 수 없습니다.

이것을 수행하고 컴파일러를 만족시키는 올바른 방법은 무엇입니까?


8
64 비트 시스템에서 CGFloat를 Float로 캐스팅하면 정밀도가 떨어집니다. CGFloat는 64 비트 시스템에서 64 비트이고 32 비트 시스템에서 32 비트이며 Float는 항상 32 비트입니다. 이를 방지하려면 Float 대신 Double을 사용할 수 있습니다.
Lukas


Xcode에서 CGFloat를 드릴 다운하고 정의 된 위치를 확인하면 32 비트 아키텍처에서는 float로 64 비트 아키텍처에서는 double로 typedef 된 것을 볼 수 있습니다.
jcpennypincher 2014

답변:


173

Float()이니셜 라이저 를 사용할 수 있습니다 .

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

17
변수 이름으로 "float"를 사용하는 것은 다소 혼란 스럽습니다. 아마도 "swFloat"와 같은 변경 사항이 있습니까?
Fermat의 Little Student

2
" 'float'는 다소 혼란 스럽습니다." 정말?
AlvinfromDiaspar

2
@AlvinfromDiaspar 예, 다른 언어가 float대신을 사용 Float하므로 변수 이름 대신 해당 유형 / 키워드처럼 보입니다.
Supuhstar

29

나처럼 게으르다면 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

1
일반적인 구조체의 후보처럼 보이는
μολὼν.λαβέ

@Ian 나는 당신의 질문을 이해하지 못합니다 ... 예?
hyouuu

13

일반적으로 가장 좋은 해결책은 유형을 유지하고 CGFloatSwift에서도를 사용하는 것입니다. CGFloat32 비트와 64 비트 컴퓨터에서 크기가 다르기 때문 입니다.

키워드 as는 동적 캐스팅 (하위 클래스의 경우)에만 사용할 수 있습니다. 예 :

class A {
}

class B : A {
}

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

그러나 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

as일반 유형을 구체적인 유형으로 캐스팅하는 데 사용할 수도 있습니다 . 예를 들어를 준수하는 제네릭 유형을 허용하는 함수가있는 경우 BinaryInteger이를 Intusing as?또는으로 캐스팅 할 수 있습니다 as!.
Peter Schorn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.