Swift Array - Разница между "Int.random (in: 0 ... 25)" и "randomElement ()" - PullRequest
3 голосов
/ 23 октября 2019

Недавно я начал изучать swift с помощью онлайн-курса.

Мне было дано задание на создание пароля из заданного массива, содержащего символы. Мы выучили в основном два примера кода, чтобы случайным образом выбрать один.

  1. variable[Int.random(in: 0...25)]
  2. variable.randomElement()

Оба работают очень хорошо, когда вытаскивают одинэлемент из массива, но только «variable[Int.random(in: 0...25)» при многократном объединении с плюсом (+).

Почему это так?


Я посмотрел документацию, но не смогt найти ответ

https://developer.apple.com/documentation/swift/array/2994747-randomelement


Объяснение:

Этот код работает:

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"]

//The number of letters in alphabet equals 26
var password = alphabet[Int.random(in: 0...25)] + alphabet[Int.random(in: 0...25)] + alphabet[Int.random(in: 0...25)] + alphabet[Int.random(in: 0...25)] + alphabet[Int.random(in: 0...25)] + alphabet[Int.random(in: 0...25)]  

print(password)

Этокод не работает, потому что randomElement () становится серым после объединения нескольких с плюсом (почему?)

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"]

//The number of letters in alphabet equals 26
var password = alphabet.randomElement() + alphabet.randomElement() + alphabet.randomElement() + alphabet.randomElement() + alphabet.randomElement() + alphabet.randomElement()  

print(password)

Редактировать: Спасибо за быстрое объяснение, ребята!

Ответы [ 3 ]

1 голос
/ 23 октября 2019

Разница в том, что randomElement возвращает необязательную строку (String?), в отличие от нижнего индекса, который возвращает необязательный. Почему randomElement возвращает необязательную строку? Что ж, если массив пуст?

И Swift не может понять, как добавить 2 необязательные строки (не говоря уже о 6! Так что он просто сдался). Один из способов исправить это - принудительно развернуть возвращаемые значения randomElement:

let password = alphabet.randomElement() + alphabet.randomElement() + alphabet.randomElement()! + alphabet.randomElement()! + alphabet.randomElement()! + alphabet.randomElement()!

Мы знаем, что массив не пустой, поэтому мы можем безопасно принудительно развернуть его здесь.

Возможно, randomElement является лучшим методом для использования здесь, потому что он заставляет вас думать о ситуации, когда массив пуст, и обрабатывать его соответствующим образом. Первый подход с индексами не предусматривает проверки того, является ли массив пустым, правильны ли индексы и т. Д.

0 голосов
/ 26 октября 2019

Я тоже начал этот курс, и, подумав об этом, мне нравится метод .randomElement (), и спасибо за ответы. Это помогло мне понять, почему один метод работает, а другой - нет и почему. Способ .randomElement () имеет для меня больше смысла.

0 голосов
/ 23 октября 2019

Это связано с разным типом возврата между двумя подходами.

Индексирование массива строк возвращает, как и следовало ожидать, строку с этим индексом.

Однако .randomElement() функция имеет другую подпись: она возвращает необязательный элемент последовательности, в вашем случае - необязательную строку (String?).

Оператор '+' определен для строк, но не для необязательных строк. Чтобы сложить элементы, возвращенные из .randomElement(), вам нужно сначала развернуть их. Учитывая, что у вас есть замкнутая последовательность, вы можете безопасно развернуть их с помощью '!':

var password = alphabet.randomElement()! + alphabet.randomElement()! + alphabet.randomElement()! + alphabet.randomElement()! + alphabet.randomElement()! + alphabet.randomElement()! 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...