Я искал несколько сообщений, думаю, я не могу написать расширение под swift и вызвать его из кода Objective-C, верно?
@objc подобные атрибуты поддерживают только методы, класс, протоколы?
Я искал несколько сообщений, думаю, я не могу написать расширение под swift и вызвать его из кода Objective-C, верно?
@objc подобные атрибуты поддерживают только методы, класс, протоколы?
Ответы:
Вы можете написать расширение 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.3, аннотация @objc необходима, если вы хотите использовать расширение в файлах классов 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];
@nonobjc
аннотацию.
Это решение работает для Swift 2.2 и Swift 3 . Обратите внимание, что из Objective-C будут доступны только расширения для классов (не для структур или перечислений).
import UIKit
extension UIColor {
//Custom colours
class func otherEventColor() -> UIColor {
return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
}
}
Затем #import "ProductModuleName-Swift.h" в файл ObjC.
Swift 4
extension UIColor {
// As of Swift 4.0.3, the @objc annotation is needed if you want to use the extension in Objective-C files
@objc
class func otherEventColor() -> UIColor {
return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
}
}
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
Если вы считаете, что все настроили правильно (пометили свои Swift-объекты с помощью @objcMembers или @objc, импортировали заголовок моста "ProductModuleName-Swift.h" и т. Д.) - но все равно получаете сообщение об No visible @interface for 'FooClass' declares the selector 'fooSelector'
ошибке:
Убедитесь, что вы видите свои интерфейсы в заголовке моста , ctrl + cmd
щелкнув по нему. Если нет, ознакомьтесь с моим ответом на этот вопрос: заголовок Swift to Objective-C не содержит классов Swift.