값을로 저장해야 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
답변
일반적으로 가장 좋은 해결책은 유형을 유지하고 CGFloat
Swift에서도를 사용하는 것입니다. CGFloat
32 비트와 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