Невозможно добавить значение типа «[xxx]» с индексом типа «(Int, () -> ())» - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть эта проблема, ошибка доступа к индексу массива.Индекс должен быть целым числом, но он не работает.Я пытался изначально с переменной, но в этом примере я изменил его на целое число 0, просто чтобы показать его нет переменной, которая является проблемой.

   let location = SNStore.Welland[index].locations[0] {
                    if location.timestamp > 0 {

                    }
                }

ошибка:

 Cannot subscript a value of type '[LocationStore]' with an index of type '(Int, () -> ())'

Так может кто-нибудь объяснить, почему массив не хочет int для своего индекса?Это странно, и я не понимаю.

Я проверил объявление мест в быстрой справке, и оно правильно показывает, как места были объявлены в структуре.(в структуре он имеет фигурные скобки на конце, чтобы инициализировать его пустым.)

var locations: [LocationStore]

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Подписка в Swift осуществляется за кулисами, вызывая специальный метод subscript, который принимает Int.Поэтому, когда вы пишете:

locations[0]

Swift действительно вызывает функцию subscript со значением внутри []:

locations.subscript(0)

Вы не можете вызвать subscript напрямую, но он есть, и вы можете определить пользовательскую подписку для своих классов, реализовав для них subscript.

Вы путаете Swift с дополнительными фигурными скобками { }, которые следуют за locations[0].Swift интерпретирует { } и их содержимое как замыкание с подписью () -> () (не вводит, не выводит).Из-за синтаксиса завершающего замыкания Swift затем интерпретирует это замыкание как второй аргумент функции subscript, которая вызывается для locations для выполнения индексации.Эта функция подписки принимает один аргумент, Int, но вы передаете два аргумента, Int и закрытие () -> ().Это то, что сообщение об ошибке говорит вам.

Исправление заключается в удалении лишних { }:

let location = SNStore.Welland[index].locations[0]
if location.timestamp > 0 {
    // do something
}
0 голосов
/ 04 декабря 2018

Я думаю, у вас есть лишние скобки.Попробуйте это:

 let location = SNStore.Welland[index].locations[0]
 if location.timestamp > 0 {

 }
...