混编注意事项

新架构注意事项

Posted by Yxi on March 10, 2021

前言

持续学习


1. 图片管理

单模块管理图片时,podspec文件,xcassetspng/jpg类型的文件不要重复写,这样会造成图片文件的重复加载

错误示范:

1
s.resource = 'XXX/Resource/**/*.{png,jpg}',  'XXX/Resource/**/*.{xcassets}`

因为这时xcassets里的图片会被前面会被'XXX/Resource/**/*.{png,jpg}'再次加载,造成图片重复

2. 远程仓库安装后,如果想展示文件夹,podspec使用subspec形式,具体可参考AFNetworking

3. 单模块 pod 内,既有 OC 又有 Swift 代码,如何相互调用?

因为模块单工程后,没有我们熟知的bridge-header.h文件和target-Swift.h,所以要有以下操作,才能相互调用

3.1 OC 使用 Swift:

3.1.1 OC 使用 Swift:

swift 定义的内容如果需要被 OC 引用,必须声明为public 如果需要整个类(方法和属性)提供给OC,可以在类定义前添加@objcMembers,或者部分提供给OC的属性或方法前添加@objc

eg.

  • 全部内容提供给OC
    1
    2
    3
    4
    5
    
    @objcMembers public class ClassAAA : NSObject {
          var a1: String!
          func funcAAA() {
          }
    }
    
  • 只提供方法funcAAA
    1
    2
    3
    4
    5
    
    @objc public class ClassAAA : NSObject {
          var a1: String!
          @objc public func funcAAA() {
          }
    }
    
3.1.2 swift 定义的协议如果要给OC引用,还需要将协议继承class

eg.

1
2
3
4
protocol ABCDelegate: class {
    func funcAAA() {
    }
}
3.1.3 在podspec文件内加入以下代码
s.prefix_header_contents = <<-EOS

  #ifdef __OBJC__

  #import <XXXModule-Swift.h> (module名-Swift.h)

  #endif

  EOS

3.2 Swift使用OC

在模块内任意OC 头文件中 import 需要使用OC代码即可

4、模块间既有OC又有Swift代码,如何相互调用?

4.1 OC 使用 Swift

在 OC 模块的.podspecdepency Swift模块名 在 OC 文件中 @import swift 模块 被引用的 swift 文件需要添加@objc public关键字

4.2 Swift 使用 OC

在模块的.podspecdepency OC模块名

s.dependency 'Module'

在 swift 文件中import Module

5 总结:

  • 不同模块 OC 使用 Swift 模块
    1. 需要先在模块的 .podSpec 文件中添加s.dependency 'Swift 模块名'
    2. 在 OC 文件中 @import Swift 模块名
    3. Swift 文件需要添加@objc public关键字
    4. 如果在 OC 的 .h 文件使用,需要添加 @class Swift 文件名; (e.g. @class VideoCell;)
  • 同一模块 OC 使用 Swift
    1. 在 OC 文件中#import "模块名-Swift.h" (e.g. #import "ZPMPosition-Swift.h")
    2. Swift 文件需要添加@objc public
    3. 如果在 OC 的 .h 文件使用,需要添加 @class Swift 文件名; (e.g. @class VideoCell;)
  • 不同模块 Swift 调用 OC
    1. 需要先在模块的 .podSpec 文件中添加 s.dependency 'Swift 模块名' (e.g. s.dependency 'SDWebImage'
    2. import 模块名 (e.g. import SDWebImage
  • 同一模块 Swift 调用 OC
    1. 需要先在模块的 .podSpec 文件中添加 s.dependency 'Swift 模块名' (e.g. s.dependency 'SDWebImage'
    2. import 模块名 (e.g. import SDWebImage