2016-10-12 5 views
0

Я застреваю, пытаясь обновить мой многомерный массив. Во-первых, я фильтрую для определенной строки под названием title, которая служит моим идентификатором. Затем я хочу заменить значение для описания для этого фильтрованного массива.обновить массив кортежей с определенным индексом

Я уже пытался решить эту проблему с чем-то вроде rowContent[1] = descriptionTranferred (значение в индексе 1, которое является описанием, должно быть заменено значением в описанииTranferred). Я также попробовал rowContent.description = descriptionTranferred, но это тоже не удалось.

Есть ли способ обновить значение описания в моем массиве?

Вот мой код:

СВИФТ 3

var rowContent = Array<(title: String, description: String)>() 


func transferData(descriptionTranferred: String, identifier: String) { 
    if rowContent.contains(where: {$0.title == identifier}) { 

     rowContent[1] = descriptionTranferred 

    } else { 
     print ("nothing") 
    } 
} 

ответ

1

Это не многомерный массив, но массив кортежей с именованными параметрами. Попробуйте:

rowContent[1].description = descriptionTranferred 

Но я предполагаю, что вы пытаетесь изменить описание в кортеже на индекс, который соответствует идентификатор так заменить if условие:

if let index = rowContent.index(where: {$0.title == identifier}) { 
    rowContent[index].description = descriptionTranferred 
}else { 
    print ("nothing") 
} 
+0

Ваше решение работает отлично! И да, вы тоже правы с кортежами ... Я был так смущен в какой-то момент, что не понял, что использовал массив кортежей. – Jake2Finn

1

Во-первых, вы теряете отверстие { на вашей функции: р

var rowContent = Array<(title: String, description: String)>() 

func transferData(descriptionTranferred: String, identifier: String) { 
    if rowContent.contains(where: {$0.title == identifier}) { 
     rowContent[1] = descriptionTranferred 
    } else { 
     print ("nothing") 
    } 
} 

в строке rowContent[1] = descriptionTranferred, вы пытаетесь присвоить descriptionTranferredString), до rowContent[1], который является кортежем (title: String, description: String).

Вам нужно присвоить строку правильного компонента кортежа:

rowContent[1].description = descriptionTranferred 

Этот код, скорее всего, происходит сбой. Вы всегда устанавливаете description строки по индексу 1, без какого-либо рассмотрения его названия. Возможно, вы хотели установить описание для каждой строки, где title == identifier?

func transferData(descriptionTranferred: String, identifier: String) { 
    let rowsToUpdate = rows.filter{ $0.title == identifier } 

    if rowsToUpdate.isEmpty { 
     print("No rows to update.") 
     return 
    } 

    for var row in rowsToUpdate { 
     row.description = descriptionTranferred 
    } 
} 

Это сделает его «работа», но это не оптимально. Для этой цели вам не следует использовать кортежи. Структуры представляют собой гораздо более подходящую структуру данных для этих данных:

struct RowContent { //TODO: needs better name 
    let title: String 
    var description: String 
} 

var rows = [RowContent]() 

func transferData(descriptionTranferred: String, identifier: String) { 
    let rowsToUpdate = rows.filter{ $0.title == identifier } 

    if rowsToUpdate.isEmpty { 
     print("No rows to update.") 
     return 
    } 

    for var row in rowsToUpdate { 
     row.description = descriptionTranferred 
    } 
} 
+0

Я думаю, что я буду реструктурировать свой код, как вы предлагали, так как он будет усложняться в будущем. Реализация структуры, безусловно, правильная вещь! – Jake2Finn

+1

Да. Вы обнаружите, что это обеспечивает вам большую гибкость. Структуры могут соответствовать протоколам и делать все виды отличных полиморфных и общих вещей. – Alexander

+0

Кроме того, структуры более строго типизированы, чем кортежи. По сути, ваш '(title: String, описания: String)' tuple - это тот же тип, что и любой другой кортеж '(String, String). Нет ничего, что помешало бы мне назначить мой кортеж '(FirstName: String, LastName: String) в место, где вы ожидаете название/описание – Alexander

Смежные вопросы