gpt4 book ai didi

swift - Swift 3.0 中浮点元素数组的扩展

转载 作者:搜寻专家 更新时间:2023-11-01 07:16:38 25 4
gpt4 key购买 nike

我如何在 Swift 3.0 中紧凑地编写 Array 的扩展,它适用于 FloatDouble Element 类型?

以下不起作用:

extension Array where Element: FloatingPoint
{
public func multiply(mult: Double) -> [Double] {
return self.map{Double($0) * mult}
}
}

错误是

Unable to infer closure type in the current context

为什么不能推断闭包类型?这是编译器的当前限制,还是有充分的理由无法推断出闭包类型?

更明确的版本也不起作用:

extension Array where Element: FloatingPoint
{
public func multiply(mult: Double) -> [Double] {
return self.map{(x: Element) -> Double in Double(v: x) * mult}
}
}

暂时有错误

Ambiguous reference to member '*'

我又在哪里不确定这个错误的原因。

最佳答案

从逻辑上讲,您的扩展应该通过将同质浮点类型的数组与相同类型的值相乘,并返回该类型的数组来工作。您可以简单地用 Element 类型的参数和 [Element] 的返回来表达这一点:

// this could also just be an extension of Sequence
extension Array where Element : FloatingPoint {

public func multiply(by factor: Element) -> [Element] {
return self.map { $0 * factor }
}
}

因此对于 [Float],这将接受类型为 Float 的参数并返回 [Float]

However, what if I indeed want to return an array of Double?

我不相信可以从任意FloatingPoint(甚至BinaryFloatingPoint)构造Double符合实例,因为这两个协议(protocol)(尽管它们确实需要实现 IEEE 754 规范的各个方面)实际上都没有定义符合类型的精确编码。

但是,如果您真的想要这个,您可以只写两个重载——一个用于 Float 元素,一个用于 Double 元素:

extension Sequence where Iterator.Element == Float {

public func multiply(by factor: Double) -> [Double] {
return self.map { Double($0) * factor }
}
}

extension Sequence where Iterator.Element == Double {

public func multiply(by factor: Double) -> [Double] {
return self.map { $0 * factor }
}
}

或者,如果您计划使它适用于更广泛的类型,您可以使用 protocol 来定义允许符合类型的要求将它们的值表达为 :

protocol ConvertibleToDouble {
func _asDouble() -> Double
}

extension Float : ConvertibleToDouble {
func _asDouble() -> Double { return Double(self) }
}

extension Double : ConvertibleToDouble {
func _asDouble() -> Double { return self }
}

extension Sequence where Iterator.Element : ConvertibleToDouble {

func multiply(by factor: Double) -> [Double] {
return self.map { $0._asDouble() * factor }
}
}

关于swift - Swift 3.0 中浮点元素数组的扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41856658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com