【问题标题】:Swift Array - Difference between "Int.random(in: 0...25)" and "randomElement()"Swift Array - “Int.random(in: 0...25)”和“randomElement()”之间的区别
【发布时间】:2020-02-19 19:29:52
【问题描述】:

我最近开始通过在线课程学习 swift。

我的任务是从给定的包含字符的数组中生成密码。 我们主要学习了两个代码示例来随机选择一个。

  1. variable[Int.random(in: 0...25)]
  2. variable.randomElement()

当从数组中拉出单个元素时,两者都可以正常工作,但在多次与加号 (+) 组合时只能使用“variable[Int.random(in: 0...25)”。

这是为什么呢?


我查阅了文档,但找不到答案

https://developer.apple.com/documentation/swift/array/2994747-randomelement


说明:

此代码有效:

let alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]

//The number of letters in alphabet equals 26
var password = alphabet[Int.random(in: 0...25)] + alphabet[Int.random(in: 0...25)] + alphabet[Int.random(in: 0...25)] + alphabet[Int.random(in: 0...25)] + alphabet[Int.random(in: 0...25)] + alphabet[Int.random(in: 0...25)]  

print(password)

此代码不起作用,因为“randomElement()”在将多个与加号组合后变灰(为什么?)

let alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]

//The number of letters in alphabet equals 26
var password = alphabet.randomElement() + alphabet.randomElement() + alphabet.randomElement() + alphabet.randomElement() + alphabet.randomElement() + alphabet.randomElement()  

print(password)

编辑: 感谢你们的快速解释!

【问题讨论】:

  • “变灰”是什么意思?
  • 在 Xcode 源代码中通常有一种颜色 - 当我想开始组合它时,randomElement() 会变成灰色。例如,它会变成评论(不再解释
  • 你做得很好 - 同时回答三个问题,他们都同意:-)。欢迎来到 SO。

标签: arrays swift random


【解决方案1】:

不同之处在于randomElement 返回一个可选字符串(String?),而不是返回非可选的下标。为什么randomElement 返回一个可选字符串?那么,如果数组为空呢?

而且 Swift 不知道如何添加 2 个可选字符串(更不用说 6 个了!所以它就放弃了)。解决此问题的一种方法是强制解开 randomElement 的返回值:

let password = alphabet.randomElement()! + alphabet.randomElement()! + alphabet.randomElement()! + alphabet.randomElement()! + alphabet.randomElement()! + alphabet.randomElement()!

我们知道数组不是空的,所以我们可以在这里安全地强制解包。

可以说,randomElement 是在这里使用的更好方法,因为它迫使您考虑数组为空的情况,并进行相应的处理。第一种带下标的方法没有检查数组是否为空,或者索引是否正确等。

【讨论】:

  • 那么你将如何首先检查数组是否为空,以及在这种情况下该怎么做?
  • @MaxI 这个想法是,如果你使用randomElement(),你不需要需要事先检查数组是否为空。如果数组为空,randomElement() 不会崩溃。
【解决方案2】:

这是因为两种方法的返回类型不同。

如您所料,对字符串数组进行索引会返回该索引处的字符串。

但是.randomElement() 函数具有不同的签名:它返回序列的可选元素,在您的情况下是可选字符串(字符串?)。

“+”运算符是为字符串定义的,但不是为可选字符串定义的。要将.randomElement() 返回的元素加在一起,您需要先将它们解包。鉴于你有一个封闭的序列,你可以安全地用'!'强制解开它们:

var password = alphabet.randomElement()! + alphabet.randomElement()! + alphabet.randomElement()! + alphabet.randomElement()! + alphabet.randomElement()! + alphabet.randomElement()! 

【讨论】:

    【解决方案3】:

    不要多次编写相同的代码,而是尝试一些循环:

    let alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
    var i = 0
    var temp = ""
        //The number of letters in alphabet equals 26
    while i < 6 {
        temp = temp + alphabet[Int.random(in: 0...25)]
        i += 1
    }
    let password = temp
        
    print(password)
    

    【讨论】:

      【解决方案4】:

      初学者快速使用以下解决方案

      let passwordChrt:Array = [
          "A", "a", "B", "b", "C" , "c", "D", "d", "E", "e", "F", "f", "G", "g", "H", "h",
          "I", "i", "J", "j", "K", "k", "L", "l", "M", "m","N", "n", "O", "o", "P", "p",
          "Q", "q", "R", "r", "S", "s", "T", "t", "U", "u", "V", "v", "W", "w","X", "x", "Y",
          "y", "Z", "z", 1, 2, 3, 4, 5, 6, 7 , 8 ,9, 0, "!", "@", "#", "$", "%", "^", "&", "*"] as [Any] 
      
      var password:String = "" 
      passwordChrt.shuffled()
      for _ in passwordChrt {
          if password.count < 6 {
              password.append("\(passwordChrt.randomElement() ?? <#default value#>)")
      
          }
           } 
      print(password)
      

      【讨论】:

        【解决方案5】:

        更新,更新的版本:

        func randomPassword(length: Int) -> String {
          let letters = "abcdefghijklmnopqrstuvwxyz"
          return String((0..<length).map { _ in letters.randomElement()! })
        }
            
        print(randomPassword(length: 6)) // e.g. output: "deckro"
        

        【讨论】:

          猜你喜欢
          • 2011-06-15
          • 2012-10-23
          • 2018-08-30
          • 2023-03-29
          • 2012-05-21
          • 2019-01-28
          • 2016-05-12
          • 2012-12-23
          • 2021-06-10
          相关资源
          最近更新 更多