【问题标题】:@objc' can only be applied to an extension of a class , calling extension method from swift to objective c@objc' 只能应用于类的扩展,从swift调用扩展方法到objective c
【发布时间】:2019-05-31 06:26:34
【问题描述】:

我正在创建像

这样的字符串扩展
@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,但它给出了错误

我也试过了

【问题讨论】:

  • 错误很明显。请记住,String 是一个结构,而不是一个类。
  • 那么如何在目标c类中调用它..你有什么建议吗?

标签: swift extension-methods


【解决方案1】:

你不能在 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];

【讨论】:

  • 是的,使用 NSString 返回类型而不是 String,对我有用。谢谢
猜你喜欢
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多