Category Archives: Swift

Swift, Playgrounds и XCPlayground

Перевод статьи “Swift, Playgrounds, and XCPlayground”.
Swift Playgrounds – это интересный инструмент в Xcode 6, позволяющий создавать единственный файл для тестирования кода перед тем, как поместить тестируемый код в основное приложение. До появления Playgrounds, у вас было две возможности — создать новое git ответвление от master ветки приложения, над которым вы работаете, или, как делаю я, открыть новый проект с шаблоном Single View Application и попытаться построить некоторую базу для тестирования того, что вы хотите.
Playgrounds уменьшают суммарное количество шагов между идеей и созданием  прототипа, но есть определенные вещи, которые нельзя выполнить на Playground как она есть, то есть ничего не добавляя. Например, запрос данных с сервера или показ views, нарисованных с помощью класса UIViews.
К счастью, эти возможности требуют всего лишь импорта одного модуля.

XCPlayground

XCPlayground – это новый модуль, у которого есть несколько методов, позволяющих получить максимум возможного от Playgrounds. Добавление его к вашему Playground – это простое добавление import предложения прямо сразу за предложением import UIKit, которое появляется по умолчанию:

import UIKit // это появляется по умолчанию
import XCPlayground // это мы добавляем

Выполнение XCP должно продолжаться бесконечно

Допустим мы хотим создать прототип для некоторого кода, который запрашивает API какого-то сервера и возвращает некоторые JSON данные. Сценарий для этих действий мог бы выглядеть так:

Continue reading

Многоликие функции Swift

Русский перевод статьи Natasha Murashev The Many Faces of Swift Functions.

Хотя у Objective-C синтаксис выглядит несколько странно,  по сравнению с другими языками программирования, синтаксис метода – прост и понятен. Вот небольшой экскурс в прошлое

+ (void)mySimpleMethod
{
    // метод "класса"
    // нет параметров
    // нет возвращаемых значений
}

- (NSString *)myMethodNameWithParameter1:(NSString *)param1 parameter2:(NSNumber *)param2
{
    // метод "экземпляра"
    // один параметр - типа NSString указатель,
    // второй параметр - типа NSNumber указатель
    // должен вернуть значение типа NSString указатель
    return @"hello, world!";
}

В противоположность этому, синтаксис  Swift выглядит в большинстве случаев также, как и в других языках программирования, но временами он может быть более сложным и запутанным, чем Objective-C.

Continue reading

Какие функции вызывает Swift? Часть 1: Возвращаемые значения

Это русский перевод статьи airspeedvelocity

“Which function does Swift call? Part 1: Return Values “.

Тип данных ClosedInterval “стесняется”. Вам придется уговаривать его выйти из-за спины своего друга, Range.

// r будет иметь тип Range<Int>
let r = 1...5

// если вам нужен тип ClosedInterval<Int>, вам
// следует определить его явно:
let integer_interval: ClosedInterval = 1...5

// Но если вам нужен doubles, то нет необходимости
// декларировать его явно.
// floatingpoint_interval is a ClosedInterval<Double>
let floatingpoint_interval = 1.0...5.0

Начиная с  Swift 1.0 beta 5, Range поддерживается исключительно для представления диапазонов индексов в коллекции.

Если вы не работаете с индексами, тип ClosedInterval, возможно, это то, что вам нужно. У него есть методы, подобные contains, которые за фиксированное ( независящее от длины интервала ) время определяют, содержит ли интервал некоторое значение:

Continue reading

Swift код к статье “Парсинг вложенных JSON и массивов (Arrays) в Swift.”

В этом посте представлен Swift код, который сопровождал изучение и перевод статьи Tony DiPasquale  “Парсинг вложенных JSON  и массивов (Arrays) в Swift.” (перевод) – оригинал Parsing Embedded JSON and Arrays in Swift

Автор предлагает Swift код в самих статьях, но это, как правило, только результирующий вариант и с очень малым количеством примеров.

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

Continue reading

Swift код к статье Tony DiPasquale “Реальный мир парсинга JSON в Swift”

В этом посте представлен Swift код, который сопровождал изучение и перевод статьи Tony DiPasquale  “Реальный мир парсинга JSON в Swift” (перевод) – оригинал Real World JSON Parsing with Swift .

Автор предлагает Swift код в самих статьях, но это, как правило, только результирующий вариант и с очень малым количеством примеров.

Эксперименты с алгоритмами Тони ДеПаскуале проводились в Swift 1.1, и представлены в репозитории на Github, который включает в себя различные  Playground файлы и полноценное небольшое приложение для работы  с данными с сайта Flickr.com.

Continue reading

Swift код к статьe Tony DiPasquale “Эффективный JSON с функциональными коцепциями и дженериками в Swift”

В этом посте представлен Swift код, который сопровождал изучение и перевод статей Tony DiPasquale . Статьи переведены на русский и представлены на этом сайте.

Вот эти статьи:

  1. “Эффективный JSON с функциональными концепциями и дженериками в Swift”  (перевод) – оригинал  Efficient JSON in Swift with Functional Concepts and Generics. Код Swift, сопровождающий изучение этой статьи , представлен в этом посте.
  2.  “Реальный мир парсинга JSON в Swift” (перевод) – оригинал Real World JSON Parsing with Swift . Код Swift, сопровождающий изучение этой статьи , представлен в этом посте.
  3. “Парсинг вложенных JSON  и массивов (Arrays) в Swift.” (перевод) – оригинал Parsing Embedded JSON and Arrays in Swift.  . Код Swift, сопровождающий изучение этой статьи , представлен в этом посте.

Автор предлагает Swift код в самих статьях, но это, как правило, только результирующий вариант с очень малым количеством примеров. Кроме того, хотелось отследить сам процесс превращения функции парсинга JSON-данных в Модель из тривиального и громоздкого "if-let" варианта в компактный  вариант “функциональных концепций”. Последний вариант представлен в виде цепочки трансформаций, начинающихся с запроса в “сеть” и заканчивающихся заполнением Модели данными. Он выдает на выходе не просто Модель, а Result <Модель>, включающий в себя помимо самой Модели, всевозможные ошибки на различных этапах трансформации.

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

Эксперименты с алгоритмами Тони ДеПаскуале проводились в Swift 1.1, и представлены в репозитории на Github, который включает в себя различные  Playground файлы и полноценное небольшое приложение для работы с данными с сайта Flickr.com.

Continue reading

Swift код к статьям автора Chris Eidhof

В этом посте представлен Swift код, который сопровождал изучение и перевод статей Chris Eidhof. Статьи переведены на русский и представлены на этом сайте.

Вот эти статьи:

  1.  “Работа с JSON в Swift. Безопасно и просто.” (перевод) – оригинал Chris Eidhof  “Parsing JSON in Swift. Safe and easy”
  2. Выступление в San Francisco “Функциональное программирование в Swift на примере JSON” (перевод).

Continue reading

3.Парсинг вложенных JSON и массивов (Arrays) в Swift

В предыдущих постах  – first post, second post (и соответствующие перевод первого поста и второго) – по поводу парсинга JSON в Swift. мы видели как можно использовать концепции функционального программирования и дженерики ( generics), чтобы сделать парсинг  JSON кратким и читабельным. Прошлый раз мы остановились на пользовательских операторах, позволяющих проводить декодирование JSON в Модель объектов с использованием infix нотации. В этом случае реализация Модели выглядела так:

struct User: JSONDecodable {
  let id: Int
  let name: String
  let email: String?

  static func create(id: Int)(name: String)(email: String?) -> User {
    return User(id: id, name: name, email: email)
  }

  static func decode(json: JSON) -> User? {
    return _JSONParse(json) >>> { d in
      User.create
        <^> d <|  "id"
        <*> d <|  "name"
        <*> d <|? "email"
    }
  }
}

Теперь мы можем проводить JSON парсинг непосредственно в модель нашего объекта, используя  операторы <| и <|? . Окончательный кусок, который мы здесь пропустили, – это возможность получать данные из вложенных JSON объектов и возможность парсинга массивов.

Continue reading

1.Эффективный JSON с функциональными концепциями и дженериками в Swift

Это перевод первой статьи  Efficient JSON in Swift with Functional Concepts and Generics, написанной Tony DiPasquale

Несколько месяцев назад Apple представила новый язык программирования, Swift, чем сильно воодушевила разработчиков относительно будущего написания приложений для iOS и OS X. Люди немедленно, начиная с версии  Xcode 6 Beta1 начали пробовать Swift и понадобилось не так много времени, чтобы обнаружить, что парсинг JSON – редкое приложение обходится без него – не так прост как в Objective-C. Swift является статически типизованным языком, а это означает, что мы не можем больше забрасывать объекты в типизованные переменные и заставлять компилятор доверять нам, что они таковыми и являются. Теперь, в Swift, компилятор выполняет проверку, давая нам уверенность, что мы случайно не вызовем runtime ошибки. Это позволяет нам опираться на компилятор при создании безошибочного кода, но это также означает, что мы должны делать дополнительную работу, чтобы его удовлетворить. В этом посту я обсуждаю API для парсинга JSON, который использует концепции функционального программирования и дженерики ( Generics ) для создания читаемого и эффективного кода.

Continue reading