如何在 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 实例的基础默认值。
在关于通用组合的练习中,它指出:“return 类型的 Car 意味着 addCAI() 和 func addTBE() 可以 return 任何类型的 Car。对函数可以 return 不同符合汽车类型的实例。这意味着假设的变体 addTBE() 函数可以决定是否两次添加冷空气进气口。此示例实现将 return ColdAirIntake 或 ColdAirIntake
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 实例的基础默认值。