Объединенные значения, возвращаемые из массива в Swift - PullRequest
0 голосов
/ 20 февраля 2020

Я тренируюсь на Swift, делаю упражнения с массивами. Я хотел бы выбрать случайным образом 6 букв в массиве, содержащем 26 букв алфавита, а затем объединить их для генерации строки.

У меня нет проблем с выбором значений, но когда дело доходит до их объединения, Я получаю сообщения об ошибках.

Вот мой код:

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)

Что я делаю не так?

Ответы [ 5 ]

4 голосов
/ 20 февраля 2020

Ваш алфавит в настоящее время [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()! })
1 голос
/ 21 февраля 2020

вы можете попробовать этот метод

func randomPassword(digit : Int) -> String {
    var password = ""
    for _ in 0 ..< digit {
        let number = Int.random(in: 97...122)
        password += "\(UnicodeScalar(number)!)"
    }
    return  password.uppercased()
}

let password = randomPassword(digit: 6)
print(password)
1 голос
/ 20 февраля 2020

На самом деле, я думаю, что самое простое решение - объявить расширение на верхнем уровне вашего файла, что позволит вам связать конкатенацию необязательных строк:

func +(lhs:String?, rhs:String?) -> String {
    return (lhs ?? "") + (rhs ?? "")
}

Теперь ваш исходный код будет правильно скомпилирован и работать без изменений (за исключением того, что я изменил var на let везде, чтобы исключить предупреждения компилятора):

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

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

print(password) // cpndmz
1 голос
/ 20 февраля 2020

a, b, c, d, e, f имеют тип String?. Поэтому вам нужно развернуть их, используя if-let или принудительное развертывание , т.е.

Используя принудительное развертывание ,

let a = alphabet.randomElement()!
let b = alphabet.randomElement()!
let c = alphabet.randomElement()!
let d = alphabet.randomElement()!
let e = alphabet.randomElement()!
let f = alphabet.randomElement()!

Использование if-let,

if let a = alphabet.randomElement(), let b = alphabet.randomElement(), let c = alphabet.randomElement(), let d = alphabet.randomElement(), let e = alphabet.randomElement(), let f = alphabet.randomElement() {
    let password = a + b + c + d + e + f
    print(password)
}

Использование if-let безопаснее, чем принудительное развертывание .

Примечание: Используйте let вместо var при использовании постоянных значений.

0 голосов
/ 20 февраля 2020

Вместо создания всех этих a, b, c, d, e, f переменных, вы можете просто использовать reduce(_:_:), чтобы получить ожидаемый результат.

let password = (1...6).reduce("") { (result, _) -> String in
    return result + (alphabet.randomElement() ?? "")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...