Как стать автором
Обновить

Комментарии 21

Имхо все-таки это не для больших проектов, где множество людей работают над одним и тем же кодом и необходима понятность без контакта с писавшим код.
Но все равно спасибо за интересную статью :)
Это не более чем просто особенность языка, понятность достигается тем, что все будут знать эти особенности.
Ну тут покажет только время…
Тут вобщем-то аналог вызов функции по её указателю, вещь весьма обыденная, таким образом например удобно писать парсер чего-нибудь. Ну то есть механизм немного другой, но суть близка. А вот синтаксический сахар действительно немного вводит ступор, если в примере 2.1 еще легко читается «функция которая принимает агрументом другую функцию», то запись 2.2. или не дай бог 2.4 уже вводит в ступор, если не встречаешь такие штуки часто. Даже не знаешь что у гугла спрашивать {$0 — $1}
Отлично!
Только синтаксис 2.2 и 2.3 не очень приятен на глаз.
Хорошая обзорная статья, спасибо!)

Как java-related разработчик не могу не заметить, что немного похоже на Scala. Или мне просто кажется и это просто веяния современности.

Тем не менее, жду не дождусь, когда на нем можно будет писать полноценные приложения.
Отличная статья — спасибо. Не знала про «Ход конем» — в книге «The Swift Programming Language» об этом — мимолетно.
К предыдущему комментарию:
«Не понимаю, зачем чего-то ждать — на Swift уже вовсю пишут „полноценные приложения“».
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Да, «примитивная» Apple — самая успешная и дорогая компания в мире, а вы, ребята, сидите в «минусе» или в «нуле» с вашим «интеллектуальным» высокомерием.
Вообще, такая простая операция приведена только ради примера. На самом деле ведь внутри функции, принимающей операторную функцию, как параметр, может быть сколько угодно сложная логика. И применения могут быть неожиданные. Достаточно просто помнить о такой возможности.

Вот одно из применений, о котором, наверное, стоило упомянуть в статье. Передаем операторную функцию как параметр при сортировке:
sorted([5, 7, 3], <) // результат [3, 5, 7]
sorted("sortme", >) // результат "tsrome"
Как я уже писал в другом месте, приводите реальные примеры! Иначе многим(в т.ч. и мне) просто не понятно, в каких моментах это стоит использовать в своих проектах, и стоит ли оно вообще того…
Была идея использовать «Ход конем» в приложении «Калькулятор», когда символ с кнопки — "+", "-", «х»… — почти напрямую (может быть через Dictionary ) попадает в performOperation, но оказалось, что операторную функцию можно задавать только явно.
Так работает:

func performOperation(op1: Double, op2: Double, operation: (Double, Double) -> Double) -> Double {
    return operation(op1, op2)
}

func addDouble (a1:Double, a2:Double) ->Double {return (a1 + a2)}
func multiplyDouble (a1:Double, a2:Double) ->Double {return (a1 * a2)}

let operationDictionary: Dictionary<String, (Double, Double) -> Double > = [ "+": addDouble , "x": multiplyDouble]
var symbolOperation:String = "x"

if let operation = operationDictionary[symbolOperation] {  performOperation(3.0, 2.0, operation)} // 6

А вот такой словарь:

let operationDictionary: Dictionary<String, (Double, Double) -> Double > = [ "+": + , "x": *]

дает ошибку.
Может быть есть идеи?
Вы создали словарь со «значком». Создайте словарь с лямбдами. Как-то так:
let operationDictionary: Dictionary<String, (Double, Double) -> Double > = [ "+": {$0 + $1} , "x": {$0 * $1}]

Понимаю, что не так изящно, как "+", но лучше, чем явно заданная где-то вверху функция.
Да, это много лучше, но как сделать переменным именно оператор?
Не знаю почему, но так работает:

func performOperation(op1: Double, op2: Double, operation: (Double, Double) -> Double) -> Double {
    return operation(op1, op2)
}

let operationDictionary: Dictionary<String, (Double, Double) -> Double > = [ "+": (+) , "x": (*), "-": (-)]

var symbolOperation:String = "x"

if let operation = operationDictionary[symbolOperation] { performOperation(3.0, 2.0, operation)} // 6
но зачем оно нужно?
в упор не могу понять, зачем мне такое может понадобится в рядовом проекте…
Такие штуки удобны при работе со всякими деревьями, графами и подобными сложными структурами через рекурсивные вызовы.
Обновил текст статьи, добавил пример в конце.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации