[casting] Swift에서 CGFloat를 Float로 캐스팅

값을로 저장해야 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


답변

일반적으로 가장 좋은 해결책은 유형을 유지하고 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


답변