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

标签 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: "")
}}

我正在像 swift 一样快速使用它

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

我想在 objective-c 中使用它 但我能够访问 objective-c 文件中的本地化方法 为此,我在字符串扩展名中添加了@objc,但它给出了错误

enter image description here

我也试过

enter image description here

最佳答案

您不能在 Objective-C 中使用 String。 Swift 结构不能在 Objective-C 中使用。

一种解决方案是在 NSString 的扩展中镜像您的 String 扩展。

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];

关于swift - @objc'只能应用于类的扩展,从swift调用扩展方法到objective c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56389752/

相关文章:

extension-methods - 扩展方法是否违反软件工程原则?

c# - 在 C# 中操作密封类型

c# - Dictionary<T> 的 SingleOrDefault 集合版本是什么?

ios - 重命名 Xcode 应用程序时向 Sigabrt 发出信号

swift - 更改 CorePlot 中轴上数字的大小

swift - 无法推断通用参数 'Value' 在 swift 中创建基于 block 的 KVO

c# - 使用 GetHashCode 方法扩展接口(interface),用作通用字典中的键 (C#)

c# - 提高 "shuffle"效率

ios - 为什么字典中的 "values"属性不是一个简单的数组,而是一些奇怪的东西?

ios - 命令因信号 : Segmentation fault: 11 而失败