【问题标题】:Using random on swift [duplicate]在swift上使用随机[重复]
【发布时间】:2020-01-16 22:34:08
【问题描述】:

我是 swift 的初学者,我曾尝试使用 random,但出现此错误:

不能用“UInt32”类型的参数为“[String]”类型的值下标

我不明白为什么。这是我的代码:

import UIKit

class ViewController: UIViewController {

    var Person = ["jean Michel" , "antoine roubet" , "samuel demets" , "zater burkov", "Gochnik samuel"]

    var city = ["De Paris","De Monreal","Du Maroc","De Tunis","De sarcelles","De roubaix"]

    @IBOutlet weak var quoteLabel: UILabel!

    @IBAction func changeQuote() {

        var randomIndex = arc4random_uniform(UInt32(Person.count))
        var thePerson = Person[randomIndex]
        print(thePerson)

        var randomIndex2 = arc4random_uniform(UInt32(city.count))
        var theCity = city[randomIndex2]
        print(theCity)

        quoteLabel.text = "le texte est modifié"

    }
}

【问题讨论】:

  • 不相关,但很重要:1) Swift 中的值应该有lowerCamelCase 名称。 UpperCamelCase 名称仅为类型保留。 2) 数组通过将它们的名称设为复数来更清楚地表达。 people 代替 Personcities 代替 city。另外,您不必添加像the 这样的任意词来区分。 let city = cities.randomElement()。简单!

标签: swift string random


【解决方案1】:

如果您只想编译代码,只需更改

var Person = ["jean Michel" , "antoine roubet" , "samuel demets" , "zater burkov", "Gochnik samuel"]
var randomIndex = arc4random_uniform(UInt32(Person.count))
var thePerson = Person[randomIndex]

var Person = ["jean Michel" , "antoine roubet" , "samuel demets" , "zater burkov", "Gochnik samuel"]
var randomIndex = Int(arc4random_uniform(UInt32(Person.count)))
//                ^^^
var thePerson = Person[randomIndex]

但更好地使用Int.random,正如其他答案所建议的那样。

【讨论】:

    【解决方案2】:

    在当前上下文中,您可以使用范围来生成随机索引。

    var randomIndex = Int.random(in: 0...Person.count-1)
    var randomIndexTwo = Int.random(in: 0...city.count-1)
    
    var thePerson = Person[randomIndex]
    var theCity = city.count[randomIndexTwo]
    

    但是使用数组上的方法来检索随机元素可能更容易,因为如果您的数组为空,它将是类型安全的。而且是一行。

    var thePerson = Person.randomElement()
    var theCity = city.randomElement()
    

    【讨论】:

    • 永远不要像`0 .., let alone 0...Person.count-1`这样的代码在Person数组为空时崩溃,并且通常容易出错。使用Array.indices 以无错误的方式获取索引范围。更好的是,只需致电.randomIndex()
    【解决方案3】:

    而不是使用导入的 C 函数 arc4random()。 您现在可以使用 Swift 自己的本机随机 API。 通过在所需范围内对任何数字类型调用 random() 方法

    import UIKit
    
    class ViewController: UIViewController {
    
        var Person = ["jean Michel" , "antoine roubet" , "samuel demets" , "zater burkov", "Gochnik samuel"]
    
        var city = ["De Paris","De Monreal","Du Maroc","De Tunis","De sarcelles","De roubaix"]
    
        @IBOutlet weak var quoteLabel: UILabel!
    
        @IBAction func changeQuote() {
    
            let randomIndex = Int.random(in: Person.indices)
            let thePerson = Person[randomIndex]
            print(thePerson)
    
            let randomIndex2 = Int.random(in: city.indices)
            let theCity = city[randomIndex2]
            print(theCity)
    
            quoteLabel.text = "le texte est modifié"
    
        }
    }
    

    注意:变量的 randomIndex, thePerson, randomIndex2, theCity 永远不会发生变异,应该更改为常量

    正如下面评论中所建议的,最好使用数组 .randomElement()

    因此你的 changeQuote() 将是

    @IBAction func changeQuote() {
    
        guard let thePerson = Person.randomElement() else { return }
        print(thePerson)
    
        guard let theCity = city.randomElement() else { return }
        print(theCity)
    
        quoteLabel.text = "le texte est modifié"
    }
    

    【讨论】:

    • 你的方向是正确的,但这里有很多问题。 1) randomIndexthePersonrandomIndex2theCity 的不必要的可变性 2) 永远不要编写像 0 ..< Person.count 这样的代码。很容易出错。使用array.indices。 3) 您可以在数组上使用.randomElement(),它会为您处理数组和边界检查
    • 感谢@Alexander-ReinstateMonica 更新了答案。
    猜你喜欢
    • 2018-07-02
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多