反其道而行之:ObjC调用Swift功能入门

版权声明:大熊猫猪·侯佩原创或翻译作品.谢绝转载! hopy https://blog.csdn.net/mydo/article/details/81914034

大家可能对Swift如何调用ObjC中的方法已经很熟悉了,所以这个不细表了.

这篇博文中本猫却反其道而行之,给大家介绍下如何实现:ObjC调用Swift中的功能.

现举一栗!

fileprivate let resBundleName = "HyCommonRes"

class ResBundle:Bundle{
    @objc static var bundle:ResBundle = ResBundle()

    private init(){
        let resBundlePath = Bundle.main.path(forResource: resBundleName, ofType: "bundle")!
        super.init(path: resBundlePath)!
    }
}

func hyLocalizedString(key:String,comment:String="")->String{
    return NSLocalizedString(key, tableName: "HyCommon", bundle: ResBundle.bundle, value: "", comment: comment)
}

我们的最终目的是在ObjC中调用hyLocalizedString()方法,在swift中这轻而易举:

let myString = hyLocalizedString(key:"myKey")

但遗憾的是因为hyLocalizedString()是一个全局方法,无法直接在ObjC中被发现,所以我们得把它变成ResBundle的实例方法,在ResBundle中添加同名方法:

@objc func hyLocalizedString(key:String,comment:String="")->String{
        return NSLocalizedString(key, tableName: "HyCommon", bundle: ResBundle.bundle, value: "", comment: comment)
    }

注意必须要加@objc前缀.

打开x.m文件,在开头导入桥接文件,名称为项目名-Swift.h:

#import "ProjecgName-Swift.h"

这个文件是Xcode为我们生成的,没法在磁盘上找到对应文件.

下面就是久违了的调用代码:

NSString *cancelString = [[ResBundle bundle] hyLocalizedStringWithKey:@"CancelString" comment:@""];

[btn setTitle:cancelString forState:UIControlStateNormal];

可以看到,ObjC没有诸如Swift中方法默认参数值的概念,所以这里必须输入comment实参,即使你根本不鸟它到底是神马…

That’s all!!! 感谢观赏.

猜你喜欢

转载自blog.csdn.net/mydo/article/details/81914034