【问题标题】:Returning Two Types from one Function using Protocol Conformance使用协议一致性从一个函数返回两种类型
【发布时间】:2018-07-19 17:53:33
【问题描述】:
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
   }
}

我收到一条错误消息:

无法将“Double”类型的返回表达式转换为“T”类型

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

【问题讨论】:

  • 缺少ProductCoupon 的定义
  • 我认为这与我正在寻求的解决方案无关,除非你能说服我否则

标签: swift generics swift-protocols


【解决方案1】:

假设你的方法编译,

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

struct Foo : PriceCalculatable {}

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

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

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

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

要使其工作,您可以创建一个ConvertileFromDouble 协议并使IntDouble 符合它。在协议中,您需要指定一个以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 {
        ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 2015-09-07
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多