@objc'只能应用于类的扩展,从swift到目标c调用扩展方法

时间:2019-05-31 06:26:34

标签: swift extension-methods

我正在创建像

这样的字符串扩展名
@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 :(得分:0)

您不能在Objective-C中使用String。 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];