如何在 Swift 的通用结构中使用 if Bool.random() 从函数获得不同的输出?

How to get different output from function using if Bool.random() within generic struct in Swift?

在关于通用组合的练习中,它指出:“return 类型的 Car 意味着 addCAI() 和 func addTBE() 可以 return 任何类型的 Car。对函数可以 return 不同符合汽车类型的实例。这意味着假设的变体 addTBE() 函数可以决定是否两次添加冷空气进气口。此示例实现将 return ColdAirIntake 或 ColdAirIntake ,基于 Bool.random()。这是一种灵活的方法,但它可能是也可能不是您想要的。现在,此函数的调用者必须考虑 addTBE() 可能的可能性return 个项目,从一个电话到下一个电话都有不同的选项”。但是,当 运行 函数 addTBE() return 始终产生相同的结果。与书中所述的代码相比,有错误,所以我更改了下面注释掉的一行的一部分,但仍然是相同的输出。如果您可以建议如何在通用结构中使用 if Bool.random() 从函数获得不同的输出。

protocol Car {
    var options: String {get}
}

struct Azda: Car {
    var kind = "8 MPS"
    var options: String {
        "Azda \(kind)"
    }
}

func options<T: Car>(_ car: T) {
    print("Love to ride \(car.options)")
}

options(Azda())

struct Tuner {
    private struct ColdAirIntake<Tuning: Car>: Car {
        var car: Tuning
        var options: String {
            "\(car.options) air cooled"
        }
    }

    private struct TurboBackExhaust<Tuning: Car>: Car {
        var car: Tuning
        var options: String {
            "\(car.options) with turbo back exhaust"
        }
    }

    func addCAI() -> some Car {
        return ColdAirIntake(car: Azda())
    }

    func addTBE() -> some Car {
        var coolIn = ColdAirIntake(car: Azda())
        if Bool.random() {
        coolIn = ColdAirIntake(car: Azda()) // coolIn = ColdAirIntake(car: coolIn)
        }
        return TurboBackExhaust(car: coolIn)
    }
}

var tuner = Tuner()
var frontBack = tuner.addTBE()
options(frontBack)
var front = tuner.addCAI()
options(front)

原因是你说的那几行:

 if Bool.random() {
    coolIn = ColdAirIntake(car: Azda()) // coolIn = ColdAirIntake(car: coolIn)
    }

你设置 coolIn 的第二行对你传入的 Azda 结构的基础选项 属性 没有影响。我能够通过在 Azda 的构造函数中使用随机布尔值来纠正这个问题:

 struct Azda: Car {
var kind = "8 MPS"
var options: String {
    if(Bool.random()){
        return "Azda Option A"
    }
    else{
        return "Azda Option B"
    }
}

}

每次输出一个随机结果。这个问题有很多解决方案,但最重要的是,从根本上说,您对 Boolean.random() 的调用不会执行任何操作,因为它不会改变您正在使用的 Azda 实例的基础默认值。