协议扩展类型Self与初始化类型

时间:2015-11-11 17:58:57

标签: swift swift-extensions swift2.1 swift-protocols

让我们说出于学术目的,我更喜欢像

这样的表达
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)

1 个答案:

答案 0 :(得分:3)

所有IntegerType类型都可以提升为IntMaxIntMax可以转换为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,它会进一步讨论这个问题,以及为什么类似的功能可能会很危险,除非非常小心。