首页 > 解决方案 > 连接从 Swift 中的数组返回的值

问题描述

我正在训练 Swift,用数组做一些练习。我想在一个包含 26 个字母的数组中随机选取 6 个字母,然后将它们连接起来生成一个字符串。

我选择这些值没有问题,但是在连接它们时,我收到错误消息。

这是我的代码:

var 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 a = alphabet.randomElement()
var b = alphabet.randomElement()
var c = alphabet.randomElement()
var d = alphabet.randomElement()
var e = alphabet.randomElement()
var f = alphabet.randomElement()

var password = a + b + c + d + e + f

print(password)

我究竟做错了什么 ?

标签: arraysswiftconcatenation

解决方案


您的字母表目前是[String](aka Array<String>)。您可能应该将其更改为 an [Character]

更好的是,因为randomElement在 上定义Collection,并且Collectionwho ElementisCharacter会起作用。String是 a Collection,它ElementCharacter,所以它完全符合要求。最好的方法是拆分字符串文字:

let alphabet = "abcdefghijklmnopqrstuvwxyz"

randomElement()返回 a T?(在本例中为String?, aka Optional<String>),而不仅仅是 a T。因为如果alphabet要为空(不是,但如果是),那么将没有要返回的元素。唯一明智的做法是返回nil

由于在您的情况下,您可以确定它alphabet是非空的,并且randomElement()始终返回一个有效的非元素,因此您有理由使用!运算符强制解包结果。现在不要养成这个坏习惯。您有充分的理由在此处强制展开,但不应将其用作可选处理的首选方法。

你也经常重复自己。您可以通过使用某种循环来改善这一点。

在这种情况下,您可以使用一个巧妙的小技巧。从0..<6具有 6 个元素的范围开始,您可以调用map它来转换其元素(即0, 1, ... 5)。在这种情况下,您可以通过忽略每个元素来转换每个元素,并将其替换为字母表中的随机元素:

(0..<6).map { _ in alphabet.randomElement()! }

结果是一个Array<Character>. 您只需将其转换为字符串即可。最终代码:

let alphabet = "abcdefghijklmnopqrstuvwxyz"
let password = String((0..<6).map { _ in alphabet.randomElement()! })

推荐阅读