Как бы я сопоставил два отдельных массива, заполненных строками в Swift? - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть эти два массива ниже, и я хочу, чтобы они соответствовали друг другу. Если первый элемент имеет номер «333-333-3333», я хочу, чтобы он совпадал с первым элементом в другом массиве, который называется «Джон». Например, я хочу вернуть строку John, когда я ввожу 333-333-3333 в поле поиска. Возможно ли это сделать, если я использую массив?

let personName : [String] = ["John", "San", "Jim"]
let personNumber : [String] = ["333-333-3333", "111-111,1111", "222-222-2222"]

Ответы [ 3 ]

2 голосов
/ 06 апреля 2020

Несколько массивов очень плохо. Гораздо лучшим решением является структура, которая содержит всю информацию об одном человеке

struct Person {
    let name, number : String
}

let people = [Person(name: "John", number: "333-333-3333"),
              Person(name: "San", number: "111-111,1111"),
              Person(name: "Jim", number: "222-222-2222")]

и поиске

if let foundPerson = people.first(where: {$0.number == "333-333-3333"}) {
    print(foundPerson.name)
} else {
    print("Person not found")
}
1 голос
/ 06 апреля 2020

Можно попробовать

let personName  = ["John", "San", "Jim"]
let personNumber  = ["333-333-3333", "111-111,1111", "222-222-2222"]
let search = "333-333-3333"
if let item = personNumber.firstIndex(of:search) {
    print(personName[item])
}

Или лучше OOP Раствор

let arr = [Item(name: "John", number: "333-333-3333")]

if let item = arr.first(where: { $0.number == search }) {
    print(item.name)
}


struct Item{
    let name,number:String
}
0 голосов
/ 06 апреля 2020

Я бы порекомендовал использовать функцию zip (), которая предназначена для объединения двух последовательностей в одну последовательность кортежей.

let combined = zip(personName, personNumber)

Если вы печатаете вместе, вы увидите, что он содержит этот массив:

[("John", "333-333-3333"), ("San", "111-111,1111"), ("Jim", "222-222-2222")]

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

func getName(for number: String, combined: [(String, String)]) -> String? {
    return combined.first{ $0.1 == number }?.0
}

getName(for: "333-333-3333", combined: combined) // returns John
getName(for: "444-444-444", combined: combined) // returns nil
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...