2016-06-22 3 views
0

Как перебрать каждый элемент ClosedInterval в Swift? Например, этот код выдает ошибку:Итерация по замкнутому интервалу в Swift 2.x

let UInt8_interval: ClosedInterval = UInt8.min ... UInt8.max 

for x in UInt8_interval { 

    print(x) 

} 

Ошибка говорит: Type 'ClosedInterval<UInt8>' does not conform to protocol 'SequenceType'.

Для некоторых видов побитовых операций, я хочу перебрать от 0 до 255 включительно, и важно, чтобы тип оставался UInt8. Поэтому я не могу использовать диапазон, потому что максимальное значение типа не может быть частью диапазона. Но я не могу понять, как перебирать ClosedInterval.

+2

Вы можете использовать диапазон в Swift 3. Они исправили это! – vacawama

ответ

1

Как насчет использования stride?

let allUInt8 = UInt8.min.stride(through: UInt8.max, by: 1) 

for x in allUInt8 { 
    print(x) 
} 

Тип allUInt8 является StrideThrough<UInt8>.

И если вы хотите массив, который содержит все UInt8:

let arrayUInt8 = Array(allUInt8) 
+0

Спасибо за ответ и ваш комментарий к вопросу! Они очень полезны. – verbose

+0

Добро пожаловать, подробно! :-) – vacawama

+0

Я думаю, что для создания массива код 'let arrayUInt8 = Array (arrayLiteral: allUInt8)' – verbose

1

ClosedInterval не соответствует SequenceType, который означает, что он не может быть использован в for in как есть. Если вы все еще хотите использовать ClosedInterval используйте диапазон, созданный start и end интервала:

for x in UInt8_interval.start..<UInt8_interval.end { 
    print(x) 
} 

Не самое большое решение, но довольные Swift 3 адреса такие вещи, как vacawama упоминалось.

+1

Это пропускает '255', и вы не можете использовать' ... 'из-за проблемы с диапазоном в Swift 2.2. – vacawama

+0

@vacawama хорошие моменты. Будет ли '...' вместо '.. <' исправлять эту проблему? – JAL

+1

@JAL: Нет, потому что перед тем, как Swift 3, * все * диапазоны хранятся внутри как 'start ..