Swift项目集成到Obc项目中的坑

logo

背景环境:

最近公司要求将手头的Swift项目集成到新的Obc项目中去,于是乎就开始了踩坑过程。

先来说说我的思路,首先是先将第三方pod库去重加入到Obc项目中,然后再将源码除去APPDelegate,pch,info.plist 等通用文件其他的都拖进项目中,额,再做每一个步骤的时候最好是做好一步就build一次,这样更加容易解决报错。

第一步Pod库去重集成

首先就是要修改podfile文件,为了兼容Swift 要添加

use_framework

Q:

添加后执行pod install 发现提示Unable to determine Swift version for the following pods:错误

A:

点buildSettings中的+号,添加SWIFT_VERSION,指定版本号4.2(根据你最新的Swift版本添加),再执行pod install解决问题。

Q:

iOS Undefined symbols for architecture arm64解决办法

A:

1.Build Setting->Architectures查看是否包含arm64指令集
2.如果用CocoaPods导入的库,Build Setting->Linking->Other Linker Flags,添加$(inherited)

兼容Swift的工程配置设置

Defines Module 设置为YES
OC引用Swift Xcode自动式实现的桥接文件命名方式是ProductModuleName-Swift.h
直接在OC项目中,import ProductModuleName-Swift.h即可

Swift 方法 大括号前面一定要空格,否则不会被识别到 roductModuleName-Swift.h 中就oc类就无法调用,只能swif类内部调用了。

一. OC调用Swift中的Class类这里

  • 1.这个类必须是继承NSObjec或者NSObjec的子类
  • 2.Class前面要加@objcMembers (这个关键字是让该类所有属性和方法加上@objc),3.0之前是苹果自动帮你加上的,据说嫌弃打包会偏大一些,后面改成玩家自己加。
例如:@objcMembers class CustomServiceTool: NSObject {}
  • 3.类中的协议、枚举、结构体这些东西的调用

    1. 协议:直接在前面加一个@objc

      1
      @objc protocol CustomServiceToolDelegate: NSObjectProtocol {}
    2. 枚举:试了一下,必须定义出Int类型,前面加@objc才能调用(毕竟swift的枚举比OC强大太多)

      1
      @objc enum CPLineType: Int {
 case schoolToHome = 0case homeToSchool
		case return}


 3. 结构体:在oc中是不能调用struct里面的内容的,你想在类似class前面加个 @objc的方法加在struct前面是不行的,那但是我们又想在oc中调用struct的属性,那怎 么办呢?我们只能够再建一个类,在类里写个方法来返回struct中的值
坑点:

1.每次在一个类前面加个@objcMembers的时候都需要重新编译一遍才能打出提示(混编期间,报错请不要怀疑自己的代码,大部分编译一下就没事了。。。)

2.有种特殊的情况,比如我一个OC控制器中调用了swift写的view,然后其他用swift写的控制器需要调用OC控制器,这时候要是只是把OC控制器写到桥接文件中是会报错的。(这种就是混编项目比较变态的情况)————解决办法:swift写的View用向前声明( @class BannerView);

3.swift中的一些类型是OC没有的,或者类型名字差不多但是类型完全不同
例如:
swift中的Int定义成可选类型的时候,这时候OC是调不了swift的Int类型,解决方式,定义普通Int型

您的支持将鼓励我继续创作!