gpt4 book ai didi

arrays - Swift 数组字典

转载 作者:搜寻专家 更新时间:2023-11-01 06:23:54 25 4
gpt4 key购买 nike

我正在制作一款具有不同游戏模式的应用,每种游戏模式都有一些分数。我试图将所有分数存储在数组字典中,其中字典的键是游戏的 id(字符串),关联的数组包含该游戏模式的分数列表。但是,当我尝试将数组的值初始化为随机值时,Swift 中断,并出现以下错误。这段代码将在 Playground 上中断。我做错了什么?

let modes = ["mode1", "mode2", "mode3"]
var dict = Dictionary<String, [Int]>()

for mode in modes
{
dict[mode] = Array<Int>()
for j in 1...5
{
dict[mode]?.append(j)
let array:[Int] = dict[mode]!
let value:Int = array[j] //breaks here
}
}

错误:

Execution was interrupted, reason: EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP, subcode=0x0).

最佳答案

你的问题是数组下标是从零开始的。所以当你写:

var a: [Int] = []
for i in 1...5 {
a.append(42)
println(a[i])
}

你会得到一个运行时错误,因为第一次在循环中你订阅了a[1]当只有 a[0] 时.在您的代码中,您要么需要执行 for j in 0..<5let value = array[j-1] .

顺便说一下,尽管做 dict[mode]! 是绝对安全的(因为你刚刚添加了它),这是最好避免的习惯,因为有一天你的代码不会像你想象的那样正确,而且 !会在你的脸上爆炸。 几乎总有一种更好的方式来写你想要的东西而不需要 ! .

此外,一般来说,每当您使用数组下标时,您都会冒着意外搞砸的风险,因为意外地处理了像这里这样的越界索引。有很多选择意味着实际使用 a[i]很容易避免:

  • 如果您想要集合的索引(如数组),而不是:

    for i in 0..<a.count { }

    你可以写

    for i in indices(a) { }
  • 如果你想给数组中的元素编号,而不是

    for i in indices(a) { println("item \(i) is \(a[i])" }

    你可以写

    for (i, elem) in enumerate(a) { println("item \(i) is \(elem)") }

    如果集合恰好有一个 Int对于索引(例如 Array ),您可以使用 i作为索引,但如果不是(例如 String),获取索引和元素的替代方法是:

    let s = "hello"
    for (idx, char) in Zip2(indices(s),s) { }
  • 如果您想要数组的第一个或最后一个元素,而不是:

    if a.count > 0 { let x = a[0] }
    if a.count > 0 { let x = a[a.count - 1] }

    你可以写

    if let first = a.first { let x = first }
    if let last = a.last { let x = first }
  • 首选 map , filterreduce一般的 for 循环(但不要执着于它,有时 for 循环更好)

关于arrays - Swift 数组字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27769205/

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