【发布时间】:2017-01-25 16:26:50
【问题描述】:
如何在 Swift 3.0 中紧凑地编写 Array 的扩展,它适用于 Float 和 Double Element 类型?
以下不起作用:
extension Array where Element: FloatingPoint
{
public func multiply(mult: Double) -> [Double] {
return self.map{Double($0) * mult}
}
}
错误是
无法在当前上下文中推断闭包类型
为什么不能推断闭包类型?这是编译器当前的限制,还是无法推断闭包类型的充分理由?
更明确的版本也不起作用:
extension Array where Element: FloatingPoint
{
public func multiply(mult: Double) -> [Double] {
return self.map{(x: Element) -> Double in Double(v: x) * mult}
}
}
这次是错误
对成员“*”的模糊引用
我又不确定这个错误的原因。
【问题讨论】:
-
@Hamish 做你建议的工作,谢谢!这可能已经足够好了。但是,如果我确实想返回一个
Double数组怎么办? (例如,考虑这样一种情况,而不是控制mult参数的类型,如上例所示,我没有参数,而是乘以我没有编写的返回Double的函数。在在这种情况下,将Array元素乘以需要将它们转换为Double并返回[Double]的函数。 -
我继续将我的 cmets 转换为答案 :)
-
@Hamish 您可能对使用初始化器的 DoubleConvertible 实现感兴趣,正如 Martin R 在此处 stackoverflow.com/questions/26794282/… 建议的那样,我在此处使用 stackoverflow.com/a/29179878/2303865
-
@LeoDabus 是的,这是解决“可以传递给给定函数重载的类型”问题的一个非常常见的解决方案(在本例中为
Double的init(_:))。您实际上也可以对其进行概括,以便处理不同类型之间的转换,例如参见my answer here。 -
@LeoDabus Swift 2 也有协议组合 ;) 它只是有不同的语法 (
protocol<X, Y, Z>)。
标签: swift floating-point swift3 swift-extensions