2

假设出于学术目的,我更喜欢这样的表达

someInt.asDouble

而不是股票

Double(someInt)

由于所有各种 Swift 整数类型都符合IntegerType协议并且因为似乎有一个Double()初始化器适合所有类型的 int 类型,所以我想我可以这样:

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)
4

1 回答 1

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建议在不复制的情况下对类型进行简单的重新解释,并且 avar建议它是该值的属性。这不是正在发生的事情。您实际上是将其转换为不同的值,以不同的格式存储,甚至可能不相等。(对于大整数,可能存在舍入误差,例如x != Int(x.toDouble())。)

也值得一读尝试扩展 IntegerType(和 FloatingPointType);为什么不能将所有 Int 类型都转换为 NSTimeInterval,它进一步讨论了这个问题,以及为什么除非非常小心,否则类似的功能可能会很危险。

于 2015-11-11T21:21:35.060 回答