Я искал некоторые сообщения, я думаю, что не могу написать расширение под swift и называть его кодом Objective-C, правильно?
@objc как атрибуты поддерживают только методы, класс, протоколы?
Я искал некоторые сообщения, я думаю, что не могу написать расширение под swift и называть его кодом Objective-C, правильно?
@objc как атрибуты поддерживают только методы, класс, протоколы?
Вы можете написать расширение Swift и использовать его в коде ObjectiveC. Протестировано с помощью XCode 6.1.1.
Все, что вам нужно сделать, это:
создайте расширение в Swift (аннотация @objc)
импортировать "ProjectTarget-Swift.h" в ваш класс ObjectiveC (где "ProjectTarget" представляет цель XCode, с которой связано расширение Swift)
вызовите методы из расширения Swift
Это решение работает для Swift 2.2 и Swift 3. Обратите внимание, что только расширения для классов (не для структур или перечислений) будут доступны из Objective-C.
import UIKit
extension UIColor {
//Custom colours
class func otheEventColor() -> UIColor {
return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
}
}
Затем #import "ProductModuleName-Swift.h" в вашем файле ObjC.
Как описано в других ответах, импорт сгенерированного заголовка Swift работает в большинстве случаев.
Исключением является то, что категория определена по мостовому типу (т.е. расширение определено на String
, а не NSString
). Эти категории автоматически не будут подключены к их партнерам Objective-C. Чтобы обойти это, вам нужно будет использовать тип Objective-C (и введите возвращаемое значение в код Swift с помощью as String
) или укажите расширение для типов Swift и Objective-C.
Я узнал, что в Swift 4.0 мне пришлось добавить @objc
перед моим расширением, чтобы методы расширения Swift стали видимыми экземпляром класса Objc я расширялся.
Короче:
Настройка конфигурации файла:
CustomClass.h
CustomClass.m
CustomClassExtension.swift
В CustomClassExtension:
@objc extension CustomClass
{
func method1()
{
...
}
}
В моем AppDelegate.m:
self.customClass = [[CustomClass alloc] init];
[self.customClass method1];