Access Control – Контроль доступа Associated Types – Связанные типы Associated values – Связанные значения Associativity – ассоциативность Automatic Reference Counting – Автоматический подсчет ссылок Bridging Header – Связующий заголовок Capture values – Захват переменных Capture List – Список захвата Closures – Замыкания Compound Assignment Operators – Составные опреаторы присваивания Computed Properties – Вычисляемые свойства Convenience initializer – вспомогательный инициализатор… Читать далее »
Подразделы: Базовые типы Enumerations (перечисления) Option Sets (наборы опций) Unions (Объединения) Pointers (Указатели) Function Pointers (Указатели на функции) Global Constants (глобальные константы) Preprocessor Directives (Директивы препроцессора) Macros (Макросы) Build Configurations (конфигурации билдов) Swift предоставляет эквивалент C примитивам целого типа – char, int, float, double, но между C int и Swift Int к примеру нет неявного преобразования. Предпочтительней использовать Swift типы… Читать далее »
Adopting Cocoa Design Patterns (Адаптация Cocoa паттернов) Подразделы: Delegation (Делегирование) Error Handling (Обработка ошибок, Swift 2.0) Key-Value Observing (наблюдатель за изменениями в свойствах объектов) Target-Action (Цель-Действие) Introspection (Самонаблюдение) API Availability (доступность API) Swift 2.0 Delegation (Делегирование) Пожалуй самый часто используемый паттерн, реализуется с помощью свойства в которое сохраняется делегат. Главный подводный камень – не забыть проверить что делегат не равен… Читать далее »
Подразделы: Strings (строки) Numbers (числа) Collection Classes (классы коллекций) Swift 2.0: Errors (Ошибки) Foundation Data Types (Типы данных foundation) Foundation Functions (функции Foundation) Core Foundation Unmanaged Objects (Неуправляемые объекты) Существуют типы в Swift и Objective-C, которые являются взаимозаменяемыми (bridged). Например NSString и String, NSArray и Array Strings (строки) Везде где в API ожидается NSString мы можем подставлять Swift String, и… Читать далее »
Наконец добавили типизированность в Objeсtive-C, но к сожалению в ограниченном обьеме – только для коллекций. К примеру Objective-C код
|
@property NSArray<NSDate *>* dates; @property NSSet<NSString *>* words; @property NSDictionary<KeyType: NSURL *, NSData *>* cachedData; |
будет импортирован в swift как
|
var dates: [NSDate] var words: Set<String> var cachedData: [NSURL: NSData] |
Но, повторюсь доступно это лишь для Foundation стандартных коллекций
Подразделы: Как использовать совместно Objective-C и swift из одного Framework Target При использовании swift из Objective-C мы не можем пользоваться специфическими фишками языка swift Naming Your Product Module (именование модуля продукта) Подводные камни Как использовать совместно Objective-C и swift из одного App Target Если мы пишем обычное приложение и хотим сделать импорт Objective-C для работы в swift необходимо создать Objective-C… Читать далее »
Теперь мы всегда в runtime узнать на какой именно платформе мы запущены и применить специфические функции в случае если они доступны с помощью #available
|
if #available (iOS 9, OSX 10.10, *) { // 1 //код специфичный для этих платформ } else if #available (iOS 8.3, watchOS 2.0, *) { //код специфичный для iOS8 } else { } |
Доступны проверки для iOS, OSX, watchOS, iOSApplicationExtension, OSXApplicationExtension Звездочка обязательна, она означает что этот код будет доступен не только для указанных платформ но и для будущих (иначе после каждого релиза ОС пришлось бы добавлять новые… Читать далее »
В Swift 2.0 наконец добавили обработку ошибок. Для представления ошибок добавили протокол ErrorType. В основном для создания своих ошибок создают перечисление реализующее этот протокол
|
enum FileReadError : ErrorType { case EmptyName case NoRights(owner: String) } |
При чтении файла допустим мы будем обрабатывать 2 ситуации, пустой путь и отстутствие прав на чтение (needUser будет указывать учетную запись владельца файла) Чтобы обозначить, что функция/метод могут выбрасывать ошибки наружу – ввели ключевое слово… Читать далее »
Если бы библиотеки писали под конкретные классы, нас бы ждало дублирование кода, очень много дублирования кода, и много приведения типов.
|
func swapTwoStrings(inout a: String, inout b: String) { let temporaryA = a a = b b = temporaryA } func swapTwoDoubles(inout a: Double, inout b: Double) { let temporaryA = a a = b b = temporaryA } |
И так для каждого типа. Но лучше определить функцию которая будет работать с любым типом
|
func swapTwoValues<T>(inout a: T, inout b: T) { let temporaryA = a a = b b = temporaryA } |
– после имени функции, где T – заполнитель, указывающий на то как будет называться тип (в нашем случае переменные a и b –… Читать далее »
В swift 2.0 добавили возможность расширить не конкретный класс, а протокол, добавив методы и свойства
|
protocol RandomNumberGenerator { func random() -> Double } extension RandomNumberGenerator { func randomBoll() -> Bool { return random() > 0.5 } } |
Таким образом все типы, которые будут реализовывать этот протокол – получат доступ к методу из расширения.
|
class DumbRandom : RandomNumberGenerator { func random() -> Double { return 0.5 } } var rnd = DumbRandom() rnd.randomBoll() |