arrays - 连接从 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)
我究竟做错了什么 ?
解决方案
您的字母表目前是[String]
(aka Array<String>
)。您可能应该将其更改为 an [Character]
。
更好的是,因为randomElement
在 上定义Collection
,并且Collection
who Element
isCharacter
会起作用。String
是 a Collection
,它Element
是Character
,所以它完全符合要求。最好的方法是拆分字符串文字:
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()! })
推荐阅读
- javascript - 使用 for 循环向页面动态添加字符串的问题
- git - GIT合并不相关的历史
- vue.js - 为什么通过 scrollBy() 滚动在 Vue 组件更新挂钩中不起作用?
- python - 如何通过标签获取所有元素?
- angular - 显式指定材质下拉选择的类型而不是动态
- geospatial - 可以使用空间索引加速“单个几何内的点”查询吗?
- android - 刷新小部件上的现有数据
- excel - 跨工作表的 Excel VBA 克隆(命名)表
- clojure - clj-http 异常:ExceptionInfo clj-http: 状态 415 clj-http.client/wrap-exceptions/fn--1863 (client.clj:196)
- amazon-web-services - AWS - 使用 EC2 实例的 FailedInvocations