2016-08-17 86 views
0

我需要建立一些食品均符合命名Nutrition爲什麼我收到「通用參數無法推斷」,泛型類型

protocol Nutrition { 
     var calories: Double { get set } 
     var price: Double { get set } 
    } 

    struct Hamburger: Nutrition { 
     var calories = 100.0 
     var price  = 8.0 
    } 

    struct PadThai: Nutrition { 
     var calories = 110.0 
     var price  = 8.50 
    } 

下一個協議的學習泛型類型+協議,我創建一個struct Individual其中有使用泛型類型的一種方法:

struct Individual { 

    var firstName: String 
    var lastName: String 

    init(fName: String, lName: String) 
    { 
     firstName = fName 
     lastName = lName 
    } 

    func eat<T: Nutrition>(food: T) -> T { 
     return food 
    } 

當我在做類似以下內容:

let array: [Nutrition] = [Individual(fName: "A", lName: "AAA").eat(Hamburger),Individual(fName: "B", lName: "BBB").eat(PadThai)] 

編譯器不斷抱怨:

Generic parameter 'T' could not be inferred 

我也期待在關於此錯誤的其他職位,但仍然無法找到一個解決方案。有誰知道如何解決這一問題。

+3

你想一個類型傳遞到的東西,預計 – Hamish

+0

型邊注的一個實例:它使用的標識符滿語雨燕約定。 'firstName'和'lastName'會優於參數名稱'fName'和'lName'。爲什麼它們與結構成員名稱不一致? – Alexander

+0

@AlexanderMomchliov:我爲fName和lName命名的原因是因爲我想簡化它。但是,您說得對,名稱應該是一致的,以便更清晰並更具可讀性。 – tonytran

回答

2

你的陣列預計實例而不是類型本身:

let array: [Nutrition] = [ 
    Individual(fName: "A", lName: "AAA").eat(Hamburger()), 
    Individual(fName: "B", lName: "BBB").eat(PadThai()) 
]