美文网首页Swift编程iOS相关
OC和Swift混编手动创建桥接文件及命名空间

OC和Swift混编手动创建桥接文件及命名空间

作者: 阿杰的人生路 | 来源:发表于2018-02-26 18:05 被阅读68次

Obj-C混编Swift && Swift混编Obj-C


image

Swift引用OC实现通过桥接头文件,OC引用Swift实现直接importProductModuleName-Swift.h

OC引用Swift或者Swift引用OC都需要将Defines Module选项设为YES

TARGETS ->Build Settings -> Packaging 中 设置Defines Module为YES

第一次在Swift创建OC文件,或者第一次OC创建Swift时,xcode会提示桥接,Creat Bridging Header即可,这个文件用于Swift调用OC文件,与OC调用Swift无关。

image

手动创建桥接文件

首先介绍下这两个选项

product module name 产品模块名称

product name 产品名称 Swift中的命名空间

路径

Target->Build Settings->all->packaging
在默认情况下,product module name和工程的Product Name一样。

在OC中引入Swift或Swift中引入OC会自动生成ProductModuleName-Bridging-Header.h的头文件用于Swift访问OC文件

如果修改的话切记要修改product name的话也要修改info.plist路径Info.plist.File 命名空间要与其一致

在Obj-C中混编Swift

  • Defines Module 设置为YES
  • OC引用Swift Xcode自动式实现的桥接文件命名方式是ProductModuleName-Swift.h
  • 直接在OC项目中,import ProductModuleName-Swift.h即可
  • 如果单纯OC调用Swift以上即可,不需要倒入什么桥接文件。

在Swift中混编Obj-C

  • Defines Module 设置为YES
  • Xcode在Swift中新建OC会生成ProductModuleName-Bridging-Header.h
    //File > New > File > iOS > Source > Header File
  • 在ProductModuleName-Bridging-Header.h桥接文件中,直接import需要引用的OC文件即可。

说到product Name 这里说一下命名空间

OC中没有命名空间这一说,都是使用类前缀(Class Prefix),当作命名空间用区分名称相同的文件,苹果规定,两字前缀苹果拥有所有权,三个字母的前缀为开发者使用。但是不冲突就没事。例如AFNetWorking NSString MBProgressHUD ···

Swift中终于添加了命名空间,在任意类中打印一下self 会出现"命名空间.className"

注意。swift中的命名空间的使用不是一个项目,而是需要跨项目,在一个项目中,都是一个命名空间,在同一个命名空间下,所有全局变量或者函数共享,不需要import,从swift开始,官方更多的建议大家使用pod来管理第三方框架,不然倒入一个框架到处都可以用

swift获取product Name

根据类名转换成类的时候需要用到 product name + . + classStringName 也就是命名空间。

在这里需要说一下,OC Swift的命名空间的问题,别的语言都有命名空间这个概念唯独,OC Swift只有一个命名空间,就是它的Product Name

//这个key 在info.plist中source code打开即可看到。
//获取命名空间
guard let nameSpace = Bundle.main.infoDictionary!["CFBundleExecutable"] else {
    print("获取命名空间
    return
}
//根据类字符串转换
guard let VcClass = NSClassFromString("\(nameSpace).\(vcName)") else {
    print("转换失败")
    return
}
//类型转换
guard let viewController = VcClass as? UIViewController.Type else {
    print("类型转换失败")
    return
}

也可以创建一个Bundle的extension

extension Bundle {
    //使用计算属性
    var spaceName: String {
//        return Bundle.main.infoDictionary?["CFBundleExecutable"] as? String ?? ""
        return infoDictionary?["CFBundleExecutable"] as? String ?? ""
    }
}

/**
guard let nameSpace = Bundle.main.infoDictionary!["CFBundleExecutable"] else {
    print("获取命名空间
    return
}
*/
//上边的获取命名空间就可以写成这个

guard let spaceNamee = Bundle.main.spaceName else {
    print("获取失败")
}


相关文章

  • OC和Swift混编手动创建桥接文件及命名空间

    Obj-C混编Swift && Swift混编Obj-C Swift引用OC实现通过桥接头文件,OC引用Swift...

  • [iOS] Swift与Objective-C混编

    一. 创建Objective-C混编桥接文件 当Swift与OC混编时,需要创建桥接文件,才能在OC中使用Swif...

  • Objective-C和Swift混编指南

    OC项目混编Swift OC项目创建第一个Swift文件的时候会提示创建桥接文件,我们选择Create Bridg...

  • Swift 和 Object-C 相互引用

    一、Swift 调用 OC 我们在Swift工程中创建OC类时 1、系统自动创建桥接文件 2、我们手动创建桥接头文...

  • 添加OC与Swift混编的桥接文件

    swift项目中是不能直接混编oc的,中间需要一个桥接文件 桥接文件怎么创建呢 首先创建一个header文件 然后...

  • Swift和OC混编出现的桥接问题

    1.如果是自己的项目要进行Swift和OC混编 请参考 oc 和 swift混编之自建桥接文件 作者:水墨九 进行...

  • OC、Swift混编

    1、在OC工厂中创建任意Swift文件 2、步骤1属于自动创建桥接文件,若点击了取消创建桥接文件也可手动创建(具体...

  • OC和Swift混编

    OC和Swift混编 1、OC项目 首次添加Swift文件时,Xcode会自动添加一个桥接文件。Build Set...

  • SWift_桥接(完整带图的步骤)

    Swift 桥接 OC. 直奔主题. 创建OC的头文件.并并命名为Bridging.步骤1步骤2 设置桥接文件的...

  • swift调用oc

    1、新建swift工程,创建oc类 ,创建桥接文件 2、在桥接文件里导入oc类的头文件 3、swift直接调用oc...

网友评论

    本文标题:OC和Swift混编手动创建桥接文件及命名空间

    本文链接:https://www.haomeiwen.com/subject/ilvyxftx.html