在Swift中收集和随机化数据

时间:2018-10-02 14:16:00

标签: arrays swift xcode

我正在使用下面的函数对数据进行随机化(使用3个不同的数组)。

func randomCharacter() -> String {

            let randomNumber = GKRandomSource.sharedRandom().nextInt(upperBound: characters.count)

            characterImageView.image = UIImage(named: characterImages[randomNumber])

            return characters[randomNumber]

        }

可以在下面看到数组(我知道这可能不是最好的用法,但这是我正在尝试学习的东西)

let characters = ["Zoolog Xander"]
let characterImages = ["Zoolog Xander"]
let characterDetails = ["Knows animals well, runs like a horse, eats a hamburger in 10 seconds and smells like a cow"]

Please see the view that contains characterLabel, ImageView and characterDetailLabel here.

除了characterDetail之外,其他方法都很好,因为当您随机分配内容时,characterLabel和ImageView匹配项是因为它们使用相同的字符串,但由于包含不同的内容,因此不会使用细节。

我打算拥有一个可以随机化并包含所有相关数据的数据集。

我试图将它们放置为以下格式,并获得对其的引用,但无法将其随机化。

let storyMakerCharacters = [
     ["character":"Zoolog Xander",
      "characterImage":"Zoolog Xander",
      "characterDetail":"Knows animals well, runs like a horse, eats a hamburger in 10 seconds and smells like a cow",
     ]
]

当我尝试使用它并对其进行随机化时, randomCharacter函数确实返回了一个错误,提示诸如:无法将[[String:String]]下标为Int。

我想从您那里听到的只是简单地以我想要的方式为我指出使用数组的正确方向,或者告诉我第二种方法在哪里/缺少什么。或者,即使您对这种情况有更好的解决方案,那也要好得多。


我已按照建议的方式更新了代码,但得到了“无法将'Character'类型的返回表达式转换为'String'类型的

return characterArray[randomNumber]

这很好。唯一缺少的部分是imageView。标题和detailText完美地随机化了。

func randomCharacter() -> Character {

            let randomNumber = GKRandomSource.sharedRandom().nextInt(upperBound: characterArray.count)

            //characterImageView.image = UIImage(named: "\(randomCharacter().characterImageString)")

            return characterArray[randomNumber]

}

我可以很好地获取characterName和characterDetailText的值,但不能获取imageView的值。它不会显示在视图上并被随机化。

characterName.text = randomCharacter().character
characterDetailText.text = randomCharacter().characterDetail
characterImageView.image = UIImage(named: "\(randomCharacter().characterImageString)")

ImageView现在确实出现了,因为我必须在结构中将characterImageString更改为UIImage

struct Character {
    var character: String
    var characterImage: UIImage
    var characterDetail: String
}

然后我编辑数组以反映这一点:

var characterArray = [Character(character: "My character", characterImage: UIImage(named:"My character")!, characterDetail: "Knows animals well..."),

要解决的最后一件事是,当我随机化数据时,我得到了不同的角色名称,图像和角色细节。我应该得到一个数据集,这样的角色名称是Burak,图像应该是与角色名称和详细信息相关联的图像。

这是当MotionEnded时如何调用数据的方式。似乎有问题。有想法吗?

characterName.text = randomCharacter().character
characterDetailTextTrial.text = randomCharacter().characterDetail
characterImageView.image = randomCharacter().characterImage

2 个答案:

答案 0 :(得分:0)

您可以构建一个结构

Struct Character {
    var character: String
    var characterImageString: String
    var characterDetail: String
}

然后使用不同的Character初始化数组

var characterArray = [Character(character: "Zoolog Xander", characterImageString: "characterImageString", characterDetail: "some detail here."),
 Character(......),
 Character(......)]

现在您可以使用您的随机数为您的characterArray下标

characterArray[randomNumber]

答案 1 :(得分:0)

对于那些可能感兴趣的人,这是我找到的可以按预期工作的解决方案:

characterArray.randomElement()在控制台中运行良好,因此,在对其进行洗牌时,打印控制台会向我显示带有详细信息的随机Character,但我仍然不知道如何将其显示在viewController上。这是我以前在视图上显示的代码;

override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
            if(event?.subtype == UIEvent.EventSubtype.motionShake) {


                characterArray.randomElement()
                print("\(characterArray.randomElement())")

                /*characterName.text = randomCharacter().character
                characterDetailTextTrial.text = randomCharacter().characterDetail
                characterImageView.image = randomCharacter().characterImage

} }

下面的代码显示了视图中的数据,但它们仍然没有关联:

  characterName.text = characterArray.randomElement()?.character
    characterDetailTextTrial.text =
characterArray.randomElement()?.characterDetail
    characterImageView.image = characterArray.randomElement()?.characterImage

借助以下代码,我能够解决该问题:

if let randomProblem = problemArray.randomElement() {
                problemName.text = randomProblem.problem
                problemDetailTextTrial.text = randomProblem.problemDetail
 }

因此,总而言之,我不必使用random4arc将数组随机化,而是使用randomElement()并在视图上获取值。