SwiftUI: безопасный индекс для связующего массива - PullRequest
2 голосов
/ 24 сентября 2019

У нас есть практика использования безопасного индекса при доступе к любому элементу в коллекции.Ниже приведено расширение, которое у нас есть.

extension Collection {
    subscript(safe index: Index) -> Element? {
        return indices.contains(index) ? self[index] : nil
    }
}

Но когда я пытаюсь использовать это с объектом привязки, оно выдает мне сообщение: 1004 *

Метка постороннего аргумента 'safe:'в нижнем индексе

Ниже приведен проблемный код

struct MyView: View {
    @ObservedObject var service: service

    var body: some View {
        List {
            ForEach(service.items.indices) { index in
                Toggle(isOn: self.$service.items[safe: index]?.isOn ?? false) {  // Error: Extraneous argument label 'safe:' in subscript
                    Text("isOn")
                }
            }
        }
    }
}

Ответы [ 2 ]

4 голосов
/ 24 сентября 2019

Два вопроса:

  1. Вам не нужно использовать items[safe: index], потому что вы получаете только действительные индексы items.indices.У вас никогда не будет индекса, выходящего за границы массива.

  2. Вы не можете использовать items[safe: index], поскольку self. $ Service.items isBinding<[Item]>, который не является коллекцией, поэтому ваше расширение к коллекции не применяется.

Просто удалите safe: и все готово.

См. Конец этого ответа для получения более подробной информации.

1 голос
/ 24 сентября 2019

Диагностическое сообщение сбивает с толку, но проблема в том, что ваш подстрочный индекс возвращает необязательный, но вы рассматриваете его как необязательный.Вам придется разобраться со случаем, когда он возвращает ноль.

Лично я думаю, что этот подход борется с системой.Тебе лучше использовать ForEach(service.items).Вместо «безопасных» подписок избегайте подписок целиком.

...