Swift CGFloat<-&燃气轮机;双重的

Swift CGFloat<-&燃气轮机;双重的,swift,double,operator-overloading,cgfloat,Swift,Double,Operator Overloading,Cgfloat,在UIKit中编写图形代码是一个PITA。Swift的“标称”浮点类型为Double。但是大多数的UIKit图形代码都使用CGFloat,根据我手机中的芯片,CGFloat可能是双精度的,也可能是浮点型的。我发现自己不得不经常使用CGFloat()和Double()转换器 我已经考虑过通过简单地提供它不断抱怨缺少的操作符来解决这个问题(无论如何,我喜欢添加大量的数字类型扩展): 有了这个,我就不必再在乎了。我意识到对于这是否是件好事,会有很多意见。我发现在32位平台上的CGFloat和Doubl

在UIKit中编写图形代码是一个PITA。Swift的“标称”浮点类型为
Double
。但是大多数的
UIKit
图形代码都使用
CGFloat
,根据我手机中的芯片,CGFloat可能是双精度的,也可能是浮点型的。我发现自己不得不经常使用CGFloat()和Double()转换器

我已经考虑过通过简单地提供它不断抱怨缺少的操作符来解决这个问题(无论如何,我喜欢添加大量的数字类型扩展):


有了这个,我就不必再在乎了。我意识到对于这是否是件好事,会有很多意见。我发现在32位平台上的CGFloat和Double之间可能存在细微差别,但我不确定我是否会看到它们。换言之,我可以这样做一次,而且只能这样做一次,然后被那些边缘情况刺痛,当fp数学在边界处崩溃时,或者我可以不断地将事物转换一百万次,但仍然会被相同的边缘情况刺痛。所以我的问题是,除了fp数学的边缘案例,还有什么其他原因不这样做吗?

我不确定我是否看到了与pi相关的帖子的联系?具有讽刺意味的是,我在Swift中对单位角度进行了一流的建模(请参阅),为什么要转换数百万次?如果您包含一些需要编写大量此类强制转换的代码,那么这个问题可能会更有趣。可能有一个更简单的替代方案,即不在模块的名称空间中引入运算符函数。“百万”次当然是夸大其词。我不担心行刑时间。这是我必须手动输入代码来来回转换的次数。我做了许多自定义控件。例如,代码必须根据时间和日历计算在何处绘制/布局事物。n区间是双精度的。因此,当您与CGRect、CGSize和任何CGContext方法交互时,您所做的每一次计算都必须转换为CGFloat。我应该补充一点,当然,任何涉及用户输入的代码,在CGFloat中,都必须向后转换为符合时间要求的内容(例如双倍)。为什么不创建一个typealias和一个ifdef呢。完全摆脱CGFloat,然后您可以直接使用所有Float64函数,而无需添加运算符等。此解决方案仍然需要为Float32、Int、blah blah blah{#if!os(32位)typealias myFloat=Float32#else typealias myFloat=Float64#end}
func * (lhs:CGFloat, rhs:Double) -> Double {
    return Double(lhs) * rhs
}

func * (lhs:CGFloat, rhs:Double) -> CGFloat {
    return lhs * CGFloat(rhs)
}

func * (lhs:Double, rhs:CGFloat) -> Double {
    return lhs * Double(rhs)
}

func * (lhs:Double, rhs:CGFloat) -> CGFloat {
    return CGFloat(lhs) * rhs
}