Swift - поиск и замена значения в кортеже - PullRequest
0 голосов
/ 03 октября 2019

У меня есть кортеж вида: [(id:String, name:String, years:Int, city:String)]

Что я должен сделать, чтобы найти определенный id и изменить city этого id?

Ответы [ 2 ]

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

Вы можете искать массив кортежей, используя firstIndex(where:), чтобы найти индекс первого элемента, который соответствует вашему условию. В вашем случае вы ищете совпадение с конкретным id, поэтому вы должны использовать закрытие, такое как { $0.id == "2" }.

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

Пример:

var info: [(id: String, name: String, years: Int, city: String)] = [
    ("1", "Fred", 35, "Bedrock"),
    ("2", "Wilma", 32, "Bedrock")
]

if let idx = info.firstIndex(where: { $0.id == "2" }) {
    info[idx].city = "Boulder"
}

print(info)

Выход

[(id: "1", name: "Fred", years: 35, city: "Bedrock"),
 (id: "2", name: "Wilma", years: 32, city: "Boulder")]

Используйте struct вместо кортежа

Тем не менее, вам действительно следует использовать struct здесь для хранения ваших значений. Кортежи в Swift действительно предназначены для временного использования (например, для возврата нескольких значений из функции), поэтому определение struct для хранения ваших значений является предпочтительным:

struct Record {
    var id: String
    var name: String
    var years: Int
    var city: String
}


var info: [Record] = [
    .init(id: "1", name: "Fred", years: 35, city: "Bedrock"),
    .init(id: "2", name: "Wilma", years: 32, city: "Bedrock")
]

Код поиска останется прежним.

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

Кортежи в swift являются неизменяемыми, одним из решений должно быть удаление элемента списка с помощью first(where:) and removeAll(where:(, а затем вставка его снова в массив. Второй вариант должен создать класс, который реализует этот кортеж.

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