使用“pow”的Swift 2协议扩展`

使用“pow”的Swift 2协议扩展`,swift,protocols,Swift,Protocols,我试图赋予任何数字任意幂的能力(特别是2)。这似乎是使用协议扩展而不是向Float、Double、Int等添加扩展的绝佳机会 protocol Raisable { func raise(exponent : Self) -> Self } extension Raisable where Self : SignedNumberType { func raise(exponent : Double) -> Self { return Self(pow

我试图赋予任何数字任意幂的能力(特别是2)。这似乎是使用协议扩展而不是向
Float
Double
Int
等添加扩展的绝佳机会

protocol Raisable {
    func raise(exponent : Self) -> Self
}

extension Raisable where Self : SignedNumberType {
    func raise(exponent : Double) -> Self {
        return Self(pow(Double(self), exponent))
    }
}

protocol Squarable : Raisable {
    func squared() -> Self
}

extension Squarable {
    func squared() -> Self {
        return self.raise(2)
    }
}
编译器显示“找不到接受类型为“(Self)”的参数列表的类型为“Double”的初始值设定项”

有没有办法改变
加薪:
来解决这个问题


提前感谢。

这里有很多重叠的问题,可能无法很好地解决(即使你解决了,结果也不会很好)。让我们浏览一下其中的一些

protocol Raisable {
    func raise(exponent : Self) -> Self
}
好的,我们已经有了第一个问题。考虑< <代码>自我>代码> <代码> int >代码>。
Int(2).升高(-1)
的结果是什么?它应该是0.5,但这不是一个整数。你打算轮到1点吗?这绝对不同于您为
Double
编写的代码

extension Raisable where Self : SignedNumberType {
    func raise(exponent : Double) -> Self {
        return Self(pow(Double(self), exponent))
    }
}
这要求所有可能的
SignedNumberType
都可以在
Double
之间转换,这是不可能的,甚至是不可取的。例如,复数满足
SignedNumberType
的所有要求,将复数提升为实指数是合理的,但是
pow
不是正确的函数。您真的需要使用不同的代码来处理这些情况。特别是考虑到<代码> i^ 2 ,这是真实的,所以只需将代码> > <代码>到其真正的组件(<代码> 0 < /代码>),然后平方,这将导致一个非常令人惊讶的结果。

extension Squarable {
    func squared() -> Self {
        return self.raise(2)
    }
}

除了其他问题,这是非常非常缓慢的(比
self*self
selfHi-Rob慢几个数量级,谢谢你花时间写这么全面的答案。看来这次我对使用新工具的热情超过了我对它们的理解。干杯!没问题。我已经写了你的
squared()
函数应该是这样的。这样做,就没有问题了。您只需要更明确一点,确保您的函数只依赖于协议中所需的内容。
protocol Multipliable {
    func *(lhs: Self, rhs: Self) -> Self
}

extension Multipliable {
    func squared() -> Self {
        return self * self
    }
}

extension Int: Multipliable {}
extension Double: Multipliable {}

2.squared()
(2.1).squared()