Я не могу объяснить, почему это работало в прежних версиях 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
заявления, чтобы избежать двусмысленности.