其他人已经解释了为什么您的代码会出错。(String.randomElement()
返回 an Optional<String>
,这与 String 不同,您不能使用 + 连接 Optionals。)
另一点:您的代码冗长且重复。计算机科学中有一个原则“DRY”。它代表“不要重复自己”。任何时候,如果您一遍又一遍地使用相同的代码(可能会有细微的变化),这就是“代码异味”,也是改进的机会。
你可以像这样重写你的代码而不重复:
func exercise() {
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 result = ""
for _ in 1...6 {
result.append(alphabet.randomElement() ?? "")
}
print(result)
}
在那个版本中,表达式alphabet.randomElement()
只出现一次。你不要重复自己。它还使用??
“nil 合并运算符”将可能的 nil 结果转换为空白字符串。
处理它的另一种方法是定义运算符的覆盖+=
,允许您将字符串选项附加到字符串:
public func +=(left: inout String, right: Optional<String>) {
left = left + (right ?? "")
}
然后你的功能变成:
func exercise() {
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 result = ""
for _ in 1...6 {
result += alphabet.randomElement()
}
print(result)
}
另一种方法是打乱您的源数组,获取前 6 个元素,然后将它们重新组合成一个字符串:
func exercise() {
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"]
let result = alphabet
.shuffled()[1...6]
.joined()
print(result)
}