не может индексировать значение типа '[item]' с индексом типа 'item' - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь зациклить массив в структуре JSON, но что бы я ни делал, я получаю сообщение об ошибке "Невозможно добавить значение типа '[item]' с индексом типа 'item'. Я могу распечатайте его всякий раз, когда я обращаюсь к каждому индексу отдельно:

self.socialTitle = (storeSocialContext.items?[1].metatags?.first?.title)!
print(self.socialTitle)

Что возвращает мне строку, как я хочу. Но я хочу строки каждого индекса, для заголовка. Это цикл, который выдает ошибку:

 var anArray = storeSocialContext.items!

                for socialIndex in anArray {
                    if anArray[socialIndex] != nil {

                    }

                }

И это структура:

struct StoreSocialContext: Decodable
{
    var items: [Item]?
}

struct Item: Decodable
{
    var metatags: [enclosedTags]?

    enum CodingKeys : String, CodingKey
    {
        case pagemap
    }

    enum PageMapKeys: String, CodingKey
    {
        case metatags
    }

    init(from decoder: Decoder) throws
    {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        let pagemap = try values.nestedContainer(keyedBy: PageMapKeys.self, forKey: .pagemap)
        metatags = try pagemap.decode([enclosedTags].self, forKey: .metatags)
    }
}

struct enclosedTags: Decodable
{
    let image: String?
    let title: String?
    let description: String?
    let siteName: String?

    private enum CodingKeys : String, CodingKey
    {
        case image = "og:image", title = "og:title", description = "og:description", siteName = "og:site_name"
    }
}

И это фрагмент данных, когда я получаю и печатаю JSONdata в консоли:

Optional([GetContext.Item(metatags: Optional([GetContext.enclosedTags(image: 
nil, title: nil, description: nil, siteName: nil)])), GetContext.Item(metatags: 
Optional([GetContext.enclosedTags(image: Optional("https://www.merriam- 
webster.com/assets/mw/static/social-media-share/mw-logo-245x245@1x.png"), 
title: Optional("Definition of BEST"), description: Optional("excelling all 
others; most productive of good : offering or producing the greatest advantage, 
utility, or satisfaction; most, largest… See the full definition"), siteName: 
nil)])), ...])

1 Ответ

0 голосов
/ 29 июня 2018

Эта часть:

for socialIndex in anArray {
    if anArray[socialIndex] != nil {
        //do stuff
    }
}

Не имеет никакого смысла.

Если у вас есть тип Thing и массив

var array: [Thing] = [thing1, thing2, thing3]

и вы используете код for thing in array { //your code here }

тогда переменная thing содержит элементы вашего массива и имеет тип Thing

В вашем коде for socialIndex in anArray ваша переменная socialIndex будет содержать элементы из вашего массива и иметь тип этих элементов массива.

Таким образом, бит, в котором вы пытаетесь индексировать в массив: anArray[socialIndex], недопустим.

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

Этот код:

let strings: [String?] = ["now", "is", "the", nil, "time"]

for string in strings {
   if let aString = string {
       print(aString)
   }
}

Будет выводить

now is the time

и код:

for string in strings {
   if strings[string] != nil { //This makes no sense. `string` is of type String
   }
}

Не имеет смысла.

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