Я шукав деякі повідомлення, я думаю, що не можу написати розширення за допомогою 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
У CustomClassExtention:
@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.
Швидкий 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 struct