Swift: Шесть киллер-фич

от автора

Есть много причин любить Swift. Вот 6 моих любимых.

1. Stride

Функция stride в Swift задает последовательность значений какого-либо «шагового» (strideable) типа. Шаговые (strideable) типы – это одномерные значения, которые можно задать для указания интервала. Допустим, вы хотите получить последовательность чисел с плавающей запятой в диапазоне от 0,0 до 8Π – для этого в Swift достаточно двух функций: stride для создания последовательности и map для применения функции.

import Darwin  let π = Double(M_PI) let max = 8.0 * π let damp = map(     stride(from:0.0, to:max, by:π / 6.0))     {1 - cos($0) * exp(-(2.0 * $0 / max))} 

Stride предлагает два варианта. В примере выше использовано имя второго аргумента to для создания следующей последовательности:
start, start + stride, start + 2 * stride…start + n * stride

Последняя составляющая (start + n * stride) строго меньше максимального значения (max). При использовании through в качестве имени второго аргумента последнее значение будет меньше или равно максимальному значению (max).

Это более-менее соотносится с открытыми и замкнутыми интервалами в математике. В отличие от замкнутых интервалов, математика не гарантирует, что при through будет достигнуто конечное значение.

stride(from:0.0, through: 1.0, by: 0.3) 

Элементы в примере выше равны 0.0, 0.3, 0.6, 0.9. Следующее число 1.2, что больше 1, поэтому последовательность останавливается.

Функция stride отлично подходит для отображений (mapping). Когда вы будете использовать код в Playground, обратите внимание на чудную возможность отображения переменных в виде графика (в заголовке приведен скриншот из Playground).

2. GeneratorOf

Используя GeneratorOf, вы сможете быстро и просто, в пару строк кода, создать последовательность. Например, нижеуказанный генератор выдаст последовательность натуральных чисел:

var n = 0 var naturalNumbers = GeneratorOf{n++} 

Каждый раз, когда вы вызываете метод next(), будет выдаваться новое значение.

naturalNumbers.next() // 0 naturalNumbers.next() // 1 naturalNumbers.next() // 2 

Небольшая правка, и будут выданы только четные значения.

var evenCount = 0 var evensGenerator = GeneratorOf{evenCount++ * 2}  evensGenerator.next() // 0 evensGenerator.next() // 2 evensGenerator.next() // 4 

Или числа Фибоначчи:

var fibs = ArraySlice([1, 1]) var fibGenerator = GeneratorOf{     _ -> Int? in     fibs.append(fibs.reduce(0, combine:+))     return fibs.removeAtIndex(0) }  fibGenerator.next() // 1 fibGenerator.next() // 1 fibGenerator.next() // 2 fibGenerator.next() // 3 fibGenerator.next() // 5 

Mike Ash предлагает красивую однострочную реализацию последовательности Фибоначчи здесь.

3. Split

Прекрасно подходит для разложения строк и других последовательностей при помощи замыкания, которое определяет условие разрыва.

let lipsum = "Lorem ipsum dolor sit amet, consectetur adipiscing elit." let words = split(lipsum, isSeparator:{$0 == " "}) // ["Lorem", "ipsum", ...] 

4. Lazy

Создайте последовательность или классы коллекций (collection types), которые готовы для перебора или отображений (mapping) без промежуточного массива. Используйте ее для тех случаев, когда необходимо скормить результат в другой стадии обработки.

let counts = lazy(words).map(count) 

5. Zip

Zip создает пары из последовательностей. Указываете два аргумента, получаете последовательность Zip2([T], [U]), которая готова для перебора или отображения (mapping).

map(zip(words, counts)){println("\($0): \($1)")} // Lorem : 5, ipsum : 5, ... 

Zip-элементы в массиве путем применения отображения (mapping):

let array = map(zip(a, b)){[$0, $1]}

6. Форматирование строк

Форматирование строк без использования NSString.

String(format: "Value: %3.2f\tResult: %3.2f", arguments: [2.7, 99.8])

Также имеется инициализатор, который позволит писать форматируемые значения в виде аргументов:

// String.init(format: String, _ arguments: CVarArgType...) String(format:"Value: %3.2f\tResult: %3.2f", 2.7, 99.8)

Перевод: Ирина Олеговна
Правка: fiveze

ссылка на оригинал статьи http://habrahabr.ru/post/259715/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *