@objc 'может применяться только к расширению класса, вызывая метод расширения от swift до target c - PullRequest
3 голосов
/ 31 мая 2019

Я создаю расширение строки как

@objc extension String {
static func className(_ aClass: AnyClass) -> String {
    return NSStringFromClass(aClass).components(separatedBy: ".").last!
}
    func localize() -> String
{
    return NSLocalizedString(self, comment: "")
}}

Я использую это по-быстрому, как

btnReferencePhoto.setTitle("ADD REFERENCE PHOTO".localize(), for: .normal)

Я хочу использовать его в цели c но я могу получить доступ к методу локализации в целевой файл C для этого я добавляю @objc в расширение строки, но это дает ошибку

enter image description here

Я тоже пытался

enter image description here

1 Ответ

0 голосов
/ 31 мая 2019

Вы не можете использовать String в Objective-C.Структуры Swift нельзя использовать в Objective-C.

Одним из решений является отражение вашего расширения String в расширении NSString.

extension String {
    static func className(_ aClass: AnyClass) -> String {
        return NSStringFromClass(aClass).components(separatedBy: ".").last!
    }

    func localize() -> String {
        return NSLocalizedString(self, comment: "")
    }
}

@objc extension NSString {
    static func className(_ aClass: AnyClass) -> NSString {
        let res = String.className(aClass)

        return res as NSString
    }

    func localize() -> NSString {
        let str = self as String

        return str.localize() as NSString
    }
}

Расширение NSString вызывает реализацию расширения String, поэтомуВы не реплицируете функциональность, просто API.

Теперь в вашем коде Objective-C вы можете сделать что-то вроде:

NSString *name = [NSString className:[SomeObjectiveCClass class]];
NSLog(@"name = %@", name);

NSString *localized = [@"test" localize];
...