我正在研究一個函式,它將所有“MP”的總成本計算為一個值并將其相加。這是我的背景關系代碼。
typealias Spell = (name: String, cat: Category, cost: Int)
let startingSpellList: [Spell] = [
("Poison", .attack, 3),
("Bio", .attack, 26),
("Fire", .attack, 4),
("Fire 2", .attack, 20),
("Fire 3", .attack, 51),
("Ice", .attack, 5),
("Ice 2", .attack, 21),
("Ice 3", .attack, 52),
("Bolt", .attack, 6),
("Bolt 2", .attack, 22),
("Bolt 3", .attack, 53),
("Pearl", .attack, 40),
("Quake", .attack, 50),
("Break", .attack, 25),
("Doom", .attack, 35),
("Flare", .attack, 45),
("Meteor", .attack, 62),
("Ultima", .attack, 80),
這是功能:
func totalCost(_ spells: [Spell]) -> Int {
let cost = spells.cost
let sum = cost.reduce(0, )
return sum
}
使用此代碼,我收到錯誤訊息:“型別 '[Spell]' 的值(又名 'Array<(name: String, cat: Category, cost: Int)>')沒有成員 'cost'。” 我應該如何修復這個錯誤?
uj5u.com熱心網友回復:
spells是 a [Spell],它是 的簡寫Array<Spell>,并且Array<Spell>沒有cost屬性。Spell陣列中的每個人都有自己的cost屬性。您可以這樣說來獲取咒語成本陣列并對成本陣列求和:
func totalCost(_ spells: [Spell]) -> Int {
let costs = spells.map { $0.cost }
let sum = costs.reduce(0, )
return sum
}
或者你可以使用一個鍵路徑文字,它可以作為一個函式:
func totalCost(_ spells: [Spell]) -> Int {
let costs = spells.map(\.cost)
let sum = costs.reduce(0, )
return sum
}
但是,使用map這種方式會創建一個臨時陣列來保存成本,這是一種浪費。您可以.lazy先使用運算子來避免臨時陣列:
func totalCost(_ spells: [Spell]) -> Int {
let costs = spells.lazy.map(\.cost)
let sum = costs.reduce(0, )
return sum
}
或者您可以融合提取cost和求和:
func totalCost(_ spells: [Spell]) -> Int {
let sum = spells.reduce(0) { $0 $1.cost }
return sum
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/384661.html
標籤:迅速
