gpt4 book ai didi

swift - 使用高阶函数 reduce 时出错

转载 作者:行者123 更新时间:2023-12-05 03:32:55 25 4
gpt4 key购买 nike

我正在开发一个函数,它将所有“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’。 “我应该如何修复此错误?

最佳答案

spells[Spell] , 这是 Array<Spell> 的简写, 和 Array<Spell>没有 cost属性(property)。每个人Spell在数组中有自己的 cost属性(property)。你可以这样说来获得一个咒语成本数组并对成本数组求和:

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
}

关于swift - 使用高阶函数 reduce 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70400275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com