Есть много причин любить 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)


  1. Egor3f
    07.06.2015 15:56
    +26

    Хм… Что-то я тут не увидел «киллер-фич», если честно.
    Можно сказать проще — в swift есть элементы функционального программирования. Или указать на удобства этого языка перед objc, который функциональную парадигму не реализует. Но «киллер-фичи» – это громко.

    Поправьте, если ошибаюсь.


  1. semmaxim
    07.06.2015 16:17
    +2

    Ну, может это и «киллер» по сравнению с ObjectiveC, но на фоне других современных языков вполне стандарт.


    1. valexey
      07.06.2015 16:29

      В objc с помощью блоков можно сделать ровно то же самое.

      Вообще не вижу в приведенном каких-то киллер фич языка. Это же можно сделать и на С++ например, и выглядеть оно будет примерно также.

      Ну, то есть я конечно рад, что эти функции в Swift в стандартной либе, но при чем тут язык?


  1. xGromMx
    07.06.2015 16:19
    +1

    В Kotlin не меньше, хотя да, я знаю это Java =)


  1. stepanp
    07.06.2015 17:15
    +9

    Форматирование и split строк просто убер фичи, нигде больше такого нет


  1. maratvildan
    07.06.2015 21:18
    +1

    Написали бы что ли для порядка, кто такая Erica Sadun)


    1. fiveze Автор
      08.06.2015 00:40
      -8

      Эрика Садун – кандидат технических наук Грузинского Технического Университета. Автор множества книг по программированию на iOS.


      1. svlasov
        08.06.2015 00:55
        +16

        Технологического института штата Джорджии


        1. fiveze Автор
          08.06.2015 01:13

          Прошу прощения.


        1. stepanp
          08.06.2015 01:25
          +14

          лол


      1. ilammy
        08.06.2015 02:01
        +8

        In Soviet Russia Squirrel institute attends YOU!!


  1. Regis
    08.06.2015 00:54
    +2

    За работу по переводу спасибо, вот только выбор материала для перевода — неудачен, увы.


    1. fiveze Автор
      08.06.2015 01:16
      +1

      Содержание мне вполне показалось полезным. Да, заголовок неудачный, но не обесценивать же из-за него весь материал.


  1. senia
    08.06.2015 10:03
    +1

    Всю статью хотелось сравнить эти «киллер-фичи» с множеством других ЯП. Например сравнение со scala получалось совсем уж разгромным.

    Но последняя «фича» «6. Форматирование строк» поставила всё на свои места. В скольких языках уже есть string interpolation, чтоб такой ужас не писать?