Swift Array-“ Int.random(in:0…25)”和“ randomElement()”之间的差异

问题描述 投票:0回答:3

我最近开始通过在线课程学习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)
arrays swift random
3个回答
0
投票

因为randomElement()返回一个Optional元素,所以不能对两个Optional使用算术运算(+)。如果您按以下方式强行打开包装,则可以使用,

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

但是应避免强行展开,因为如果alphabet数组为空,它将导致崩溃。


0
投票

区别在于randomElement返回一个可选字符串(String?),而下标则返回一个非可选字符串。为什么randomElement返回可选字符串?好吧,如果数组为空怎么办?

而且Swift无法弄清楚如何添加2个可选字符串。解决此问题的一种方法是强制解开randomElement的返回值:

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

我们知道数组不是空的,因此我们可以在此处安全地强制展开。

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


0
投票

这是由于两种方法之间的返回类型不同。

如您所料,为字符串数组建立索引将返回该索引处的String。

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

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

var password = alphabet.randomElement() + alphabet.randomElement() + alphabet.randomElement()! + alphabet.randomElement()! + alphabet.randomElement()! + alphabet.randomElement()! 
© www.soinside.com 2019 - 2024. All rights reserved.