Cocoa, Swift, Objective-C: Working with Cocoa Data Types (Работа с Cocoa типами данных)

Подразделы:

Существуют типы в Swift и Objective-C, которые являются взаимозаменяемыми (bridged). Например NSString и String, NSArray и Array

Strings (строки)

Везде где в API ожидается NSString мы можем подставлять Swift String, и наоборот. По факту, когда Swift импортирует Objective-C API он сам заменяет все вхождения NSString на String, при импорте swift в Objective-C наоборот String заменяется на NSString
Чтобы включить поддержку взаимозаменяемости строк нужно импортировать Foundation, это позволит нам использовать capitalizedString свойство доступное в NSString, но которого нет в Swift String

Можно приводить к String с помощью as

Для локализации в Objective-C использовался набор макросов NSLocalizedString, NSLocalizedStringFromTable, NSLocalizedStringFromTableInBundle и NSLocalizedStringWithDefaultValue. В Swift их заменила единственная функция NSLocalizedString(key:tableName:bundle:value:comment:)

Numbers (числа)

Swift типы Int, UInt, Float, Double автоматически приводятся к Objective-C NSNumber (Но не в обратную сторону, если ожидается Int — нельзя подставить NSNumber, т.к. внутри может быть и Bool)

Collection Classes (классы коллекций)

Arrays (массивы)

Swift позволяет использовать взаимозаменяемо Array и NSArray.


Если тип массива в Objective-C был указан — то приводится к [ObjectType] (доступно только в Swift 2.0)

Если нет то к [AnyObject]

Массив [AnyObject] можно привести к конкретному типу, но без гарантий

В данном случае если хоть один элемент имеет тип отличный от UIViewdowncastedSwiftArray будет присвоено Nil и код внутри скобок не отработает.
Но можно и делать и принудительное приведение

Но если есть элементы с типом отличным от UIView — вылетит ошибка.

При приведении swift массива к NSArray — элементы внутри должны быть совместимы с AnyObject.
Можно создавать NSArray с помощью обычного синтаксиса создания массивов

Как и у строк при импорте API происходит замена Array на NSArray и наоборот в зависимости от направления импорта.

Sets (Наборы)

Swift позволяет использовать взаимозаменяемо Set и NSSet
Все один в один как у массивов — и приведение и создание и действия при импорте API. NSSet в Objective-C после swift 2.0 так же начали поддерживать Lightweight Generics

Dictionaries (словари)

Swift позволяет использовать взаимозаменяемо Dictionary и NSDictionary

Только в Swift 2.0

И снова таки все остальное как у массивов

Errors (Ошибки) Swift 2.0

Swift позволяет использовать взаимозаменяемо ErrorType и NSError

Swift перечисление реализующее протокол ErrorType обозначенное с помощью @objc атрибута — сгенерирует как NS_ENUM определение, так и NSString константу для соответствующего домена ошибки в генерируемом заголовке (generated header)

Код

Сгенерирует

Foundation Data Types (Типы данных foundation)

Swift предоставляет удобную прослойку для взаимодействия с типами данных в Foundation. Ею удобно пользоваться при работе с CGSize и CGPoint, к примеру создание

Или доступ к функциям

Чтобы узнать побольше — стоит поизучать такие типы данных с помощью ⌘+щелчок мышью по интересующему классу. К примеру щелчок по CGRect в swift файле вывел на файл определения, рядом же видно определение расширения. Приведу частично

Swift делает взаимозаменяемыми NSUInteger и NSInteger к Int
Хотя если явно указать можно использовать и UInt

Foundation Functions (функции Foundation)

Для логирования в swift доступна функция NSLog

Так же доступна функция print(_:)
Вместо NSAssert нужно использовать assert

Core Foundation

Core Foundation типы автоматически импортируются как полноценные swift классы. Swift автоматически управляет памятью этих объектов, включая те что вы создали сами.

При использовании Core Foundation типов компилятор отрезает префикс Ref, т.к. все типы в swift — ссылочного типа. Но CFTypeRef становится AnyObject, а не CFType
Все Core Foundation объекты полученные из размеченных Apple’ом API получают автоматическое управление памятью, больше нет нужды вызывать функции CFRetain, CFRelease или CFAutorelease

Если мы написали собственную C функцию или Objective-C метод, возвращающие Core Foundation объект — нужно их пометить макросами CF_RETURNS_RETAINED или CF_RETURNS_NOT_RETAINED

Unmanaged Objects (Неуправляемые объекты)

Когда Swift импортирует API, которые не были размечены макросами управления памяти — компилятор не может автоматически управлять памятью для возвращенных такими функциями/методами Core Foundation объектов.

Возьмем для примера неразмеченную C функцию

Swift ее импортирует как

Как только мы получаем неуправляемый объект мы должны немедленно конвертировать его в управляемый до начала работы с ним.
Структура Unmanaged предоставляет 2 метода для этого
takeUnretainedValue() для получения оригинального объекта для которого не был вызван retain
takeRetainedValue() для получения оригинального объекта для которого был вызван retain

К примеру предположим, что функция StringByAddingTwoStrings возвращает not retained CFString объект. Для работы нужно вызвать на нем takeUnretainedValue

Хотя мы можем вызывать retain(), release() и autorelease() методы на неуправляемых объектах напрямую — делать это крайне не рекомендуется

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *