在泛型組合的練習中,它指出:“Car 的回傳型別意味著 addCAI() 和 func addTBE() 可以回傳任何型別的 Car。對函式的不同呼叫可以回傳不同 Car-conforming 型別的實體。這意味著假設變體 addTBE() 函式可以決定是否添加兩次冷空氣進氣口。此示例實作將基于 Bool.random() 回傳 ColdAirIntake 或 ColdAirIntake<ColdAirIntake>。這是一種靈活的方法,但它可能是也可能不是你想要的。現在,這個函式的呼叫者必須考慮到 addTBE() 可能會從一次呼叫回傳具有不同選項的專案的可能性。然而,當運行函式 addTBE() 時,總是回傳相同的結果。與書中所述的代碼相比,有錯誤,所以我改變了一行的一部分,如下所示,但仍然是相同的輸出。如果您可以建議如何在通用結構中使用 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)
uj5u.com熱心網友回復:
原因是你說的那幾行:
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 實體的基礎默認值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/411916.html
標籤:
