Не удается присвоить значение типа ‘Dictionary.Keys’ для ввода ‘String’

#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 коллекции).

Просто побочный комментарий, кажется немного сложным извлекать данные и отображать их непосредственно в представлении, если вы собираетесь использовать такое отображение во многих местах, может оказаться полезным иметь некоторые промежуточные типы данных, которые проще использовать при представлении; это действительно зависит от ваших предпочтений и общей проблемы.