Есть много причин любить 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
Комментарии (14)
semmaxim
07.06.2015 16:17+2Ну, может это и «киллер» по сравнению с ObjectiveC, но на фоне других современных языков вполне стандарт.
valexey
07.06.2015 16:29В objc с помощью блоков можно сделать ровно то же самое.
Вообще не вижу в приведенном каких-то киллер фич языка. Это же можно сделать и на С++ например, и выглядеть оно будет примерно также.
Ну, то есть я конечно рад, что эти функции в Swift в стандартной либе, но при чем тут язык?
senia
08.06.2015 10:03+1Всю статью хотелось сравнить эти «киллер-фичи» с множеством других ЯП. Например сравнение со scala получалось совсем уж разгромным.
Но последняя «фича» «6. Форматирование строк» поставила всё на свои места. В скольких языках уже есть string interpolation, чтоб такой ужас не писать?
Egor3f
Хм… Что-то я тут не увидел «киллер-фич», если честно.
Можно сказать проще — в swift есть элементы функционального программирования. Или указать на удобства этого языка перед objc, который функциональную парадигму не реализует. Но «киллер-фичи» – это громко.
Поправьте, если ошибаюсь.