Невозможно присвоить значение типа «Dictionary <String ?, String?>. Keys» для типа «String» - PullRequest
2 голосов
/ 08 марта 2019

Здесь у меня есть база данных, которую я хочу легко использовать для представления таблицы. Тем не менее, я не могу добраться до свойств, потому что я не знаю, как назначить из словаря строку. Это говорит мне:

Невозможно присвоить значение типа 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 Ответ

1 голос
/ 08 марта 2019

Полученная вами ошибка связана с тем, что Dictionary.keys возвращает коллекцию типа, выбранного вами в качестве ключа. В вашем случае вызов cases[indexPath.row].tag.preview.keys возвращает коллекцию String? (аналогично [String?])

Теперь, если вы хотите получить доступ к определенному значению из этой коллекции, вы можете сделать это следующим образом:

let someText = cases[indexPath.row].tagPreview.tag.keys.map{ $0 }[someIndex]

Обратите внимание, что использование map(). Он просто преобразует коллекцию Strings в Array of Strings с индексом Int, что упрощает доступ к отдельным элементам (в противном случае вам потребуется abit более общий / громоздкий итерационный API-интерфейс Collection).

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

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