У меня есть два массива с разными типами (классами) и количеством элементов. Когда я пытаюсь перебрать их, я зацикливаюсь столько раз, сколько элементов в меньшем массиве. Мне нужно, чтобы он проходил через оба, и когда меньшие концы, больший продолжает цикл. Надеюсь увидеть некоторые предложения.
Итак, у меня есть два массива:
var humanArray = [human, cook, manager, fighter, astronaut]
а также:
let alienArray = [martian, twixian, snikersian]
Это разные классы:
let human = People(name: "John Dou", height: 180, weight: 80, gender: "male")
а также:
let martian = Martian(numberOfLegs: 1, colorOfSkin: .red)
затем я перебираю их:
for (hum, al) in zip(humanArray, alienArray) {
print("""
\(hum.TypeName) \(hum.name),
\(hum.TypeName) \(hum.height),
\(hum.TypeName) \(hum.weight),
\(hum.TypeName) \(hum.gender),
\(al.TypeName) \(al.numberOfLegs),
\(al.TypeName) \(al.colorOfSkin)
""")
hum.say()
al.say()
}
Итак, что я должен сделать, чтобы получить все 5 итераций? Или как сделать такое (зациклиться на двух массивах) без "zip"? Без него у меня ошибка: Да, игнорируются, но как это сделать без "zip"? У меня ошибка: "Тип '([Люди], [Марсианин])' не соответствует протоколу 'Последовательность'".
Мой вопрос отличается от вопросов, которые задавались ранее, потому что у меня есть два массива с разным количеством элементов. И решения, представленные там, не подходят.
Да, они игнорируются, но как это сделать без "zip"? У меня ошибка: "Тип '([Люди], [Марсианин])' не соответствует протоколу 'Последовательность'"
Используйте два цикла for, по одному для каждого массива
Возможный дубликат В Swift я хотел бы «присоединить» две последовательности к последовательности кортежей.
Учитывая ваш пример, что вы хотите распечатать? Кем вы хотите al.colorOfSkin
быть, когда у вас закончатся инопланетяне?
Рабочее, но довольно простое решение
for i in 0..<(max(arr1.count, arr2.count)) {
if i < arr1.count {
print(arr1[i])
}
if i < arr2.count {
print(arr2[i])
}
}
Вы можете просто сделать,
var i = 0
for _ in 0..<min(alienArray.count, humanArray.count) {
print(humanArray[i].name, alienArray[i].numberOfLegs)
i += 1
}
print(humanArray[i...].compactMap({ $0.name }).joined(separator: " "))
print(alienArray[i...].compactMap({ $0.numberOfLegs }).joined(separator: " "))
только что получил тот же результат - напечатал первые три элемента
Может быть, я неправильно понял вопрос. Не могли бы вы уточнить немного больше.
Спасибо, теперь работает. Также я решил это сам, добавив в свой цикл переменную, которая += 1, и, когда переменная получает 3, я могу погрузиться во второй цикл. Но ваш способ намного элегантнее, так что еще раз спасибо.
Примите и проголосуйте, если это сработало для вас. Удачного кодирования ?
Я принял, но мои голоса не учитываются, пока у меня репутация меньше 15. Но я проголосовал и будет засчитан, когда у меня будет 15 репутаций.
При использовании
zip
, если два массива имеют разную длину, то дополнительные элементы более длинного массива просто игнорируются. Так чтоfighter, astronaut
не печатаются