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.