#ios #swift #dictionary
#iOS #swift #словарь
Вопрос:
Здесь у меня есть база данных, которую я хочу легко использовать для моего табличного представления. Однако я не могу получить доступ к свойствам, потому что я не знаю, как присвоить строку из словаря. Это говорит мне:
Не удается присвоить значение типа ‘Dictionary.Keys’ для ввода ‘String’
import Foundation
struct Test {
var title: String
var tagPreview: Tagpreview
}
struct Tagpreview {
var tag: [String?:String?]
}
var cases = [
Test(title: "title1", tagPreview: Tagpreview(tag: ["tag1": "preview1"])),
Test(title: "title2", tagPreview: Tagpreview(tag: ["tag2": nil])),
Test(title: "title3", tagPreview: Tagpreview(tag: [nil: nil])),
Test(title: "title4", tagPreview: Tagpreview(tag: ["tag4": "preview4", "tag5": nil]))
]
Я хочу использовать ключи и значения из словаря во второй структуре для последующего заполнения текстовых меток в ячейке:
cell.titleLabel?.text = cases[indexPath.row].tag.preview.keys //ERROR
cell.textLabel?.text = cases[indexPath.row].tag.preview.values//ERROR
В словарях есть кое-что, чего я нигде не могу найти, а также комплексное решение этой проблемы.
Теперь, если вы знаете другой способ, как их легко заполнить, я был бы очень признателен за это! Заранее большое спасибо и хорошего дня!
Комментарии:
1.
Array(cases[indexPath.row].tag.preview.keys).joined(separator: ", ")
вместо этого? Или что-то в этом роде
Ответ №1:
Ошибка, которую вы получаете, связана с Dictionary.keys
возвратом коллекции типа, выбранного вами в качестве ключа. В вашем случае вызов cases[indexPath.row].tag.preview.keys
возвращает коллекцию String?
(аналогично [String?]
)
Теперь, если вы хотите получить доступ к определенному значению из этой коллекции, вы должны быть в состоянии сделать это следующим образом:
let someText = cases[indexPath.row].tagPreview.tag.keys.map{ $0 }[someIndex]
Обратите внимание, что использование map()
. Он просто преобразует коллекцию Strings в массив строк, индекс которого равен Int, что упрощает доступ к отдельным элементам (в противном случае вам понадобился бы более общий / громоздкий итерационный API коллекции).
Просто побочный комментарий, кажется немного сложным извлекать данные и отображать их непосредственно в представлении, если вы собираетесь использовать такое отображение во многих местах, может оказаться полезным иметь некоторые промежуточные типы данных, которые проще использовать при представлении; это действительно зависит от ваших предпочтений и общей проблемы.