gpt4 book ai didi

swift - 使用协议(protocol)一致性从一个函数返回两种类型

转载 作者:可可西里 更新时间:2023-11-01 00:55:10 27 4
gpt4 key购买 nike

protocol PriceCalculatable {}
extension Int : PriceCalculatable {}
extension Double : PriceCalculatable {}


class PriceCalculator {
static func culculateFinalPrice<T: PriceCalculatable>(for products: [Product],
applying coupon: Coupon?) -> T {

let x = products.reduce(0) { price, product in
return price + product.price
}

var finalPrice = Double(x)

if let coupon = coupon {
let multiplier = coupon.discountPercentage / 100
let discount = Double(finalPrice) * Double(multiplier)
finalPrice -= Double(discount)
}

return finalPrice
}
}

我收到一条错误消息:

Cannot convert return expression of type 'Double' to return type 'T'

虽然Error有道理,但是我不明白为什么DoubleInt都符合这个类型却不能返回

最佳答案

假设您的方法编译通过,

让我们创建另一个符合 PriceCalculatable 的类型:

struct Foo : PriceCalculatable {}

现在我们尝试调用您的方法:

let foo: Foo = PriceCalculator.culculateFinalPrice(for: someProducts, applying: myCoupon)

从编译器的角度来看,上面的代码可以编译,但这会导致运行时不一致。运行时如何将 Double (finalPrice) 转换为 Foo

因此,您的方法不应编译。

要使其工作,您可以创建一个ConvertileFromDouble 协议(protocol)并使IntDouble 符合它。在协议(protocol)中,您需要指定一个以 Double 作为参数的初始化程序。

protocol ConvertibleFromDouble {
init(_ doubleValue: Double)
}

extension Int: ConvertibleFromDouble {

}

extension Double: ConvertibleFromDouble {

}

class PriceCalculator {
static func culculateFinalPrice<T: ConvertibleFromDouble>(for products: [Product],
applying coupon: Coupon?) -> T {
...

关于swift - 使用协议(protocol)一致性从一个函数返回两种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51418762/

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