Я искал несколько сообщений, думаю, я не могу написать расширение под swift и вызвать его из кода Objective-C, верно?
@objc подобные атрибуты поддерживают только методы, класс, протоколы?
objective-c
swift
swift-extensions
Sprhawk
источник
источник
Ответы:
Вы можете написать расширение Swift и использовать его в коде Objective-C. Протестировано с XCode 6.1.1.
Все, что вам нужно сделать, это:
создайте свое расширение в Swift (без
@objc
аннотации)#import "ProjectTarget-Swift.h"
в вашем классе Objective-C (где "ProjectTarget" представляет цель XCode, с которой связано расширение Swift)вызывать методы из расширения Swift
Обновление: как упоминал @Rizwan Ahmed, вам необходимо добавить
@objc
аннотацию:источник
Я узнал, что в Swift 4.0 я должен был добавить
@objc
перед моим расширением ключевого слова для того , чтобы методы расширения Swift , чтобы стать видимым экземпляром класса ObjC я простирающимся.Коротко:
Настройка файла конфигурации:
В CustomClassExtension:
В моем AppDelegate.m:
источник
@nonobjc
аннотацию.Это решение работает для Swift 2.2 и Swift 3 . Обратите внимание, что из Objective-C будут доступны только расширения для классов (не для структур или перечислений).
Затем #import "ProductModuleName-Swift.h" в файл ObjC.
Swift 4
источник
public
это необходимо? Уpublic
меня отлично работает без модификатора. Предполагаем ли мы, что расширение находится не в том же проекте, а импортируется из другого проекта?Как описано в других ответах, в большинстве случаев работает импорт сгенерированного заголовка Swift .
Исключение составляют случаи, когда категория определена в мостовом типе (т.е. расширение определено в типе,
String
а не в немNSString
). Эти категории не будут автоматически связаны с их аналогами в Objective-C. Чтобы обойти это, вам нужно либо использовать тип Objective-C (и привести возвращаемое значение в код Swift с помощьюas String
), либо определить расширение для типов Swift и Objective-C.источник
public extension NSString
. Если вы получите неразрешенный идентификатор или аналогичную ошибку во время компиляции, вы можете снова выполнить приведение обратно к String, например,let sVal = self as String
а затем вызвать необходимый кодsVal
mclaughlinj
сказано, как для класса NSString, так и для структуры StringИмпортируйте заголовок "#import" ProductModuleName-Swift.h в файл objective-c и добавьте @objc перед своим расширением в файл swift. Он будет нормально работать в swift 4.2 и swift 5.
источник
Если вы считаете, что все настроили правильно (пометили свои Swift-объекты с помощью @objcMembers или @objc, импортировали заголовок моста "ProductModuleName-Swift.h" и т. Д.) - но все равно получаете сообщение об
No visible @interface for 'FooClass' declares the selector 'fooSelector'
ошибке:Убедитесь, что вы видите свои интерфейсы в заголовке моста ,
ctrl + cmd
щелкнув по нему. Если нет, ознакомьтесь с моим ответом на этот вопрос: заголовок Swift to Objective-C не содержит классов Swift.источник