В Swift мы можем создать класс унаследовав его от Objective-C класса точно так же как мы можем наследоваться от swift классов.
Swift
1
2
3
4
5
importUIKit
classMySwiftViewController: UIViewController{
}
Если класс должен реализовать протокол NSCoding – необходимо реализовать инициализатор init(coder:). Если наследник класса реализующего протокол NSCoding получает дополнительные инициализаторы или любое свойство без начального значения – они тоже должны переопределять этот инициализатор. У XCode есть код заглушка… Читать далее »
В Objective-C селектор – это тип указывающий на имя метода. В Swift селекторы представлены структурой Selector, причем создавать ее можно с помощью обычной строки
Swift
1
letmySelector:Selector="tappedButton:".
Поэтому везде где код ждет селектор – можно использовать строку
Но в Swift запретили использовать performSelector и иже с ним, т.к. это небезопасно Если Swift класс унаследован от Objective-C все методы и свойства –… Читать далее »
Как уже говорилось выше, чтобы swift класс(свойство, индекс, метод) были доступны в Objective-C – необходимо предварять их атрибутом @objc (при использовании атрибутов @IBOutlet, @IBAction, или @NSManaged – атрибут @objc добавляется автоматически). Если класс унаследован от NSObject – этот класс автоматически помечается этим атрибутом. В классе помеченном @objc все public и internal члены автоматически помечаются @objc С помощью @objc так же… Читать далее »
Equality (равенство, ==) – это одинаковое ли содержание объектов. Identity (идентичность, ===) – идентичны ли объекты (один и тот же объект). Если swift класс унаследован от NSObject, то он реализует ==, который вызывает метод isEqual:, но у NSObject реализация этого метода заключается именно в проверке на идентичность. Так что если нужно свое поведение при сравнении – нужно переопределять isEqual (не… Читать далее »
Сами замыкания рассмотрены в первой книге Closures (Замыкания) Блоки Objective-C автоматически импортируются как замыкания в swift, но с пометкой атрибутом @convention(block) Чтобы была возможность вживую протестировать код из этой главы – нужно создать проект из Взаимодействие swift с Objective-C Добавим в ObjcTestClass.h свойство которое должно сдержать блок
Основная идея была раскрыта в пункте Implicitly Unwrapped Optionals (Неявно распакованные опционалы) Добавлю лишь, что помимо nonnull и nullable есть возможность оборачивать целые секции в макрос NS_ASSUME_NONNULL_BEGIN и NS_ASSUME_NONNULL_END, внутри секции все параметры и возвращаемые значения должны быть не равны nil. Например:
Id в Objective-C – это любой объект. Для того, чтобы как то отразить id в swift ввели протокол AnyObject. Таким образом все id при портировании в swift заменяют на AnyObject. Так же можно переназначить переменную объектом другого типа, если ее тип указан как AnyObject
Swift
1
2
varmyObject:AnyObject=UITableViewCell()
myObject=NSDate()
Так же возможно вызывать любой Objective-C метод или свойства на AnyObject (включая Objective-C совместимые методы… Читать далее »
Методы из Objective-C переносятся в swift практически без изменений, квадратные скобки заменяются на круглые но идут после имени метода, а не перед объектом его содержащим, первое двоеточие убирается если в метод передавались параметры. Вызываются как и свойства по точке
1
[myTableView insertSubview:mySubview atIndex:2];
Swift
1
myTableView.insertSubview(mySubview,atIndex:2)
О методах в swift описывалось здесь: Methods (Методы)
Доступ к свойствам Objective-C по точке без использования скобок
Swift
1
2
myTextField.textColor=UIColor.darkGrayColor()
myTextField.text="Hello world"
Скобки после darkGrayColor потому что, это метод класса а не свойство. В Objective-C если метод без аргументов возвращает значение – его можно было использовать как свойство (по getter) Но в Swift только свойства которые были помечены как @property являются свойствами.