Неоднозначное использование индекса в Xcode 10.2 - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть проект Swift, в котором я использую 2 расширения для любого типа Коллекции.Они обеспечивают безопасный доступ к элементам в массиве.Вот расширения:

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

subscript (safe int: Int) -> Element? {
    let index = self.index(self.startIndex, offsetBy: int)
    return self[index]
}

Это прекрасно работает, но в Xcode 10.2 теперь есть ошибки компиляции.элемента, но это не сработало.

Кто-нибудь знает, почему это больше не работает?

1 Ответ

1 голос
/ 09 апреля 2019

Я не могу объяснить, почему это работало в прежних версиях XCode, но разве вы не думаете, что ваши два subscript(safe:) достаточно двусмысленны, когда Collection.Index == Int?

И со вторым subscript(safe:),слово safe кажется неуместным, так как оно может легко вызвать сбой вашего приложения, когда int выходит за пределы коллекции.

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

    subscript (safe int: Int) -> Element? {
        let index = self.index(self.startIndex, offsetBy: int)
        return self[index]
    }
}
var arr: [String] = ["a"]
print(arr[safe: 1])

Вызывает Thread 1: Fatal error: Index out of range в строке return self[index].(Протестировано с Xcode 10.1.)

Вам лучше использовать другое слово, чем safe для второго subscript, и два subscript никогда не могут быть неоднозначными в любых версиях Xcode.

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

    subscript (offsetBy int: Int) -> Element? {
        let index = self.index(self.startIndex, offsetBy: int)
        return self[index]
    }
}

Может быть, мне нужно уточнить свое намерение.(Спасибо Нейту.)

Вы можете сделать свой второй индекс вроде safe:

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

    subscript (offsetBy int: Int) -> Element? {
        let index = self.index(self.startIndex, offsetBy: int)
        return self[safe: index]
    }
}

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

...