让我们说出于学术目的,我更喜欢像
这样的表达someInt.asDouble
而非股票
Double(someInt)
由于所有各种Swift整数类型都符合IntegerType
协议AND,因为似乎有一个Double()
初始化器适合所有类型的int类型,我想我可以这样:< / p>
extension IntegerType {
var asDouble:Double {
return Double(self)
}
}
这不起作用。我想知道为什么?我想知道是否有一些神奇的功能可以让它发挥作用?可能是where
?或者与self
引用有关?
我在操作台的控制台中遇到的错误是:
Playground execution failed: /var/folders/2k/6y8rslzn1m95gjpg534j7v8jzr03tz/T/./lldb/41416/playground37.swift:31:10: error: cannot invoke initializer for type 'Double' with an argument list of type '(Self)'
return Double(self)
^
/var/folders/2k/6y8rslzn1m95gjpg534j7v8jzr03tz/T/./lldb/41416/playground37.swift:31:10: note: overloads for 'Double' exist with these partially matching parameter lists: (Double), (UInt8), (Int8), (UInt16), (Int16), (UInt32), (Int32), (UInt64), (Int64), (UInt), (Int), (Float), (Float80), (String), (CGFloat), (NSNumber)
return Double(self)
答案 0 :(得分:3)
所有IntegerType
类型都可以提升为IntMax
,IntMax
可以转换为Double
。
extension IntegerType {
var asDouble: Double {
return Double(self.toIntMax())
}
}
如您所知,这不是一件特别有用的事情(Double(x)
是正确的语法),但它可能对其他问题有用。
如果我要创建它,我会继续使用stdlib的模式。模式为toX()
而不是asX
:
extension IntegerType {
func toDouble() -> Double {
return Double(self.toIntMax())
}
}
另请参阅toOpaque()
和toUIntMax()
。 as
建议在不复制的情况下对类型进行简单的重新解释,var
表明它是此值的属性。那不是发生了什么。您实际上将其转换为不同的值,以不同的格式存储,甚至可能不相等。 (对于大整数,可能存在舍入错误,例如x != Int(x.toDouble())
。)
还值得一读Trying to extend IntegerType (and FloatingPointType); Why can't all Int types be converted to NSTimeInterval,它会进一步讨论这个问题,以及为什么类似的功能可能会很危险,除非非常小心。