Ваш алфавит в настоящее время [String]
(он же Array<String>
). Вам, вероятно, следует заменить его на [Character]
.
Еще лучше, поскольку randomElement
определено для Collection
, и Collection
, для которого Element
равно Character
, будет работать. String
- это Collection
, а Element
- Character
, поэтому он идеально подходит для всех. Самый хороший способ сделать это - разбить строковый литерал:
let alphabet = "abcdefghijklmnopqrstuvwxyz"
randomElement()
возвращает T?
(в данном случае String?
, он же Optional<String>
), а не просто T
. Потому что если бы alphabet
было пустым (это не так, но если бы оно было), то не было бы элементов, которые нужно было бы вернуть. Единственное, что нужно сделать, это вернуть nil
.
Поскольку в вашем случае вы можете быть уверены, что alphabet
не пусто и что randomElement()
всегда будет возвращать допустимый неэлемент, вы Вы можете принудительно развернуть результат с помощью оператора !
. Теперь не делайте из этого вредную привычку. У вас есть веские основания для принудительного развертывания здесь, но его не следует использовать в качестве первого способа дополнительной обработки.
You ' повторяю также много. Вы можете улучшить это, используя al oop того или иного вида.
В этом случае вы можете использовать аккуратный трюк. Начиная с диапазона, такого как 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()! })