Побочные эффекты (Side Effects).

Это перевод статьи-эпизода “Side Effects”, размещенной на сайте pointfree.co.
Код для этого фрагмента можно найти здесь.

“Побочные эффекты” – это то, без чего не можем жить; не можем писать программы. Давайте исследуем некоторого рода “побочные эффекты”, с которыми мы сталкиваемся каждый день. Давайте выясним, почему они делают код трудным для тестирования, и как мы можем управлять ими, не теряя при этом возможности “композиции” (composition).

Введение

У нас был целый эпизод, посвященный исключительно функциям, в котором мы сделали акцент на важности ТИПОВ входов и выходов функций для того, чтобы понять, как можно применить к ним “композицию” (compose). Но есть множество других вещей, которые могут делать функции и которые нельзя “поймать” исключительно их сигнатурой. Эти вещи называются “побочные эффекты” (“side effects“).

“Побочные эффекты” – это один из главных источников сложности кода и хуже того, источник усложнения тестирования. Они также не способствуют “композиции” функций. Из прошлого эпизода мы видели, что можно извлечь множество преимуществ из “композиции” функций, но “побочные эффекты” “вставляют нам палку в колеса” в этом.
В данном эпизоде мы рассмотрим некоторые типы “побочных эффектов”, покажем, почему так трудно их тестировать, почему они мешают “композиции” и попытаемся эффективно разрешить эти проблемы.

Continue reading

Функции.

Это перевод статьи- эпизода “Functions”, размещенной на сайте pointfree.co.
Код для этого фрагмента можно найти здесь.

Давайте определим инкрементную функцию incr, которая берет целое число Int, добавляет к нему единицу и возвращает результат как целое число Int:

func incr (_ x:Int) -> Int {
return x + 1
}

При вызове мы передаем этой функции значение.

incr(3) // 4

Давайте определим функцию square, которая возводит в квадрат целое число Int:

func square(_ x:Int) -> Int {
return x * x
}

Мы можем вызвать эту функцию тем же самым способом:

square(3) // 9

Мы можем даже сделать вложенный вызов этих функций для того, чтобы сначала рассчитать приращение, а затем квадрат целого значения Int:

square(incr(3)) // 16

Это очень просто, но это не характерно для Swift. Самый высокий уровень, свободные функции (free functions), не используются для такого рода функций, в этом случае отдается предпочтение методам.

Continue reading

Установка бесконечного выполнения (indefinite execution) для асинхронных функций на Playground.

Я часто использую Playground для того, чтобы тестировать JSON реакцию, которую мы получаем из API некоторого web сайта, это действительно очень быстрое тестирования без использования симулятора.

Допустим, у нас есть код URLSession для получения JSON данных о Car наподобие того, как это представлено на Playground:

После выполнения этого кода, вы можете заметить, что данные с сайта НЕ показываются на консоли, но если вы запустите тот же самый код в Xcode проекте, то он будет работать! 😫

Continue reading

Добавление Playgrounds к Xcode проектам.

Playgrounds – прекрасный способ опробовать идеи, но я, как правило, использую их автономно. Из них можно сделать отличных компаньонов, если добавить в ваши Xcode проекты. Я особенно люблю использовать в Playground “живые  View” (Live View) для предварительного просмотра view и расположений (layout) UI элементов без необходимости прибегать к услугам Interface Builder.

К сожалению, Playground автоматически не получает доступ к коду и  ресурсам проекта.

Впервые настраивать такой доступ очень непросто, так что  я покажу, как это делается по шагам.

Continue reading

Как избавиться от ошибок “зависания” Xcode Playground с сообщениями “Launching Simulator” и “Running Playground”.

Вы когда-нибудь “зависали” с сообщениями ‘Launching Simulator‘ или ‘Running Playground‘ при запуске Playground некоторого кода? Несмотря на многократный повторный запуск Xcode или даже Mac, проблема все равно сохраняется. Я встречал много начинающих изучение Swift с помощью Playground, как это рекоммендует Apple, но они очень быстро сдаются именно из-за этой ошибки, что, конечно, очень грустно. Apple следует лучше работать в этом направлении и устранить имеющиеся в Playground ошибки, подобные этой.

У меня появилась эта ошибка, когда я пытался выполнить некоторый код на Playground и была обнаружена ошибка при выполнении кода.

После того, как ошибка была исправлена и код был изменен, я снова запустил Playground, и вот тут-то она и “зависла” на сообщении Running… 😱. Затем я вышел из Xcode и открыл Playground опять, все тоже самое – сообщение Running…😭.

Я пытался заново стартовать Xcode, Mac – все без пользы, я даже пытался заново переустановить Xcode. Затем я заметил, что он зависает на сообщении “Launching Simulator” и подумал, что это могло как-то повлиять на iOS Simulator, так как перезапуск Xcode не помогает 🤔.

Continue reading