2016-11-10 3 views
0

Я борюсь с одним из изменений Swift3. Раньше они обрабатывали ... и ..< как Range, но теперь у них есть тонна новых «поддиапазонов». Я хотел бы иметь функцию, использующую оба варианта диапазона.Диапазоны в Swift3

struct Test { 
    var data = [1,2,3,4,5] 
    subscript(r:Range<Int>) -> [Int] { 
    return Array(data[r]) 
    } 
} 
let t = Test() 
print(t[0...1]) // fails because now this is a ClosedRange 
print(t[0..<2]) 

Я хотел бы иметь

subscript(r:TakesAnyRange<Int>) -> [Int] { 
+0

Это может быть то, что вы ищете: http://stackoverflow.com/a/40377303/1187415. –

+0

@MartinR Точно :-) Мне это нравится, когда разработчики компилятора заменяют простую конструкцию тем, кому нужна хотя бы степень доктора>: - | –

+0

@MartinR Теперь, поскольку это упрощенный вопрос, я обнаружил, что для «индекса» ваше решение не работает. У вас есть другой указатель? –

ответ

0

Вы можете избежать дублирования при использовании вместо CountableRange и CountableClosedRange, так как один конвертируется в другой:

struct Test { 
    var data = [1,2,3,4,5] 

    subscript(r: CountableRange<Int>) -> [Int] { 
    return Array(data[r]) 
    } 

    subscript(r: CountableClosedRange<Int>) -> [Int] { 
    return self[CountableRange(r)] 
    } 
} 

это работает штраф за диапазон Int, что вы указали в своем вопросе. Из документации Apple:

Вы можете создать счетную диапазон над любым типом, который соответствует Strideable протокола и использует целое число в качестве ассоциированного типа Stride. По умолчанию целые числа Swift и типы указателей можно использовать в качестве границ счетного диапазона.

+0

Вот что сказал Мартин в связанном ответе. Я хотел избежать дублирования «индекса». –

+0

Собственно, что Мартин указал, что вы можете определить отдельные методы для «Range» и «ClosedRange». Проблема с этим заключается в том, что вам придется дублировать весь код в этих методах. Преимущество использования версий Countable заключается в том, что вы можете конвертировать один в другой, тем самым избегая дублирования. Обратите внимание: у меня есть только логика внутри одного из методов 'subscript'. – ganzogo

+0

Но на самом деле вы используете дублирование 'subscript' с' Countable [Closed] Range', и этого я хочу избежать: -/Я хочу, чтобы этот «индекс» был только один раз для обоих видов диапазона. Это Свифт - крушение мозга. –