Есть много причин любить 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/
Добавить комментарий