从随机字典键值创建数组

时间:2021-05-16 16:54:51

标签: ios swift

我想做一个返回字符串数组的函数,函数参数是数组大小。 数组值是来自字典键的随机字符串。我做了这个代码

import UIKit

var cards: [String:Int] = [

"crvenaSedmica":0,
"crvenaOsmica":0,
"crvenaDevetka":0,
"crvenaDesetka":0,
"crvenaDecko":0,
"crvenaDama":0,
"crvenaKralj":0,
"crvenaAs":0,
"bundevaSedmica":0,
"bundevaOsmica":0,
"bundevaDevetka":0,
"bundevaDesetka":0,
"bundevaDecko":0,
"bundevaDama":0,
"bundevaKralj":0,
"bundevaAs":0,
"zelenaSedmica":0,
"zelenaOsmica":0,
"zelenaDevetka":0,
"zelenaDesetka":0,
"zelenaDecko":0,
"zelenaDama":0,
"zelenaKralj":0,
"zelenaAs":0,
"zirSedmica":0,
"zirOsmica":0,
"zirDevetka":0,
"zirDesetka":0,
"zirDecko":0,
"zirDama":0,
"zirKralj":0,
"zirAs":0,
]

func createRandomCards(number:Int) -> [String] {
    let cardTypes = Array(cards.keys) 
    var randomCards: [String] = []

    for i in 0..<number {  
        randomCards[i] = cardTypes[Int.random(in: 0..<32)]    
    }
    return randomCards
}

createRandomCards(number: 5)

但我得到:

<块引用>

执行被中断,原因:EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0错误。

2 个答案:

答案 0 :(得分:4)

真正的错误实际上是:

<块引用>

Swift/ContiguousArrayBuffer.swift:593:致命错误:索引超出范围 2021-05-16 09:59:14.866263-0700 YOURAPPNAME[2540:97613] Swift/ContiguousArrayBuffer.swift:593:致命错误:索引超出范围

问题是您正在通过索引访问 randomCards,但该元素尚不存在。

var randomCards: [String] = []
...
randomCards[i] = cardTypes[Int.random(in: 0..<32)]
            ^ right here!

这里,randomCards 仍然是空的。 randomCards[0]randomCards[1]randomCards[2] 等都不起作用。

相反,您想要append。按索引访问仅适用于要修改现有元素的情况。

randomCards.append(cardTypes[Int.random(in: 0..<32)])

您还丢弃了函数的返回值。而不是...

createRandomCards(number: 5)

...你应该将它分配给一个常量。

let cards = createRandomCards(number: 5)

答案 1 :(得分:1)

不要使用那个 for 循环。它已被抽象为 map 方法。正如您所见,自己编写代码很容易出错。

另外,不要对键的计数进行硬编码。

func createRandomCards(number: Int) -> [String] {
  AnyIterator { }
    .prefix(number)
    .map { cards.keys.randomElement()! }
}
相关问题