OC项目接入Swift踩坑记录

2,788 阅读2分钟

#Swift接入

OC use Swift method

1.将Swift导入OC

#import "ProductModuleName-Swift.h"

ProductModuleName-Swift.h文件中包含了.swift文件中的声明等。

2.Include Swift Classes Using Forward Declarations

@class MySwiftClass; in .h

#import "ProductModuleName-Swift.h" in .m

3.使用@objc暴露函数给OC 或者 使用@objcMembers暴露整个类给OC

实现 OC 接口和重写 OC 方法时自动给函数添加 @objc 标识

Swift use OC method

1.创建桥接头文件 首次添加Swift时会提示增加bridging header

2.转化宏定义

Swift只支持简单的数值宏定义,函数式等复杂的宏定义不支持,需要一个中间类转化一下,创建一个中间类 KBSwiftConstant.swift, 如下:

+ (CGFloat)ScreenWidth{
    return SCREEN_WIDTH;
}

Swift中不建议使用宏,简单的可以使用let,复杂的宏可以使用静态函数,内联函数,generics等。

Swift Style Guide

  1. Protocol
class MyViewController: UIViewController {

}

// MARK: - UITableViewDataSource
extension MyViewController: UITableViewDataSource {
 
}

// MARK: - UIScrollViewDelegate
extension MyViewController: UIScrollViewDelegate {

}

2.Optional

Use optional binding "if let"

if let myOptionalObject = myOptionalObject {
  // do many things with myOptionalObject
}

3.[weak self] in closure

resource.request().onComplete { [weak self] response in
  guard let self = self else {
    return
  }
  let model = self.updateModel(response)
  self.updateUI(model)
}

Attention

1.bridging header分模块

2.class delete 关键字

3.没有nullable修饰符的OC属性会默认转化为swift的隐式可选型(!),系统不会提示加?解包,解包时需注意,如果属性值可能为空,需要在属性末尾加?,例如:self.property?.property

4.初始化方法

(1)初始化函数需要使每个属性都有初始值,optional类型自动初始值为nil

(2)不自动集成父类构造函数,原因为子类集成父类的构造函数容易导致初始化不全面,即不符合条件(1)

(3)执行顺序规范

class childClass: fatherClass{
	var childProperty:Any?
	init(childProperty:Any?){
		self.childProperty = childProperty
		super.init()
		self.fatherProperty = ...
}

(4) convinence init

自定义初始化参数,需要符合以下原则:

  • convinence init函数中需调用当前类中其他初始化函数
  • designated init函数中需调用父类的designated init函数
  • convinence init需要最终调用到designated init函数

5.setter

Swift不识别OC自动生成的setter方法,直接对属性赋值,即可调用到setter方法

6.单例

仅在定义全局变量时将其构造器标志为 private,即可自动使用 dispatch_once 进行初始化,保证原子性,如下:

class MyManager {
    // 全局变量
    static let shared = MyManager(string: someString)
    let string: String
    private init(string: String) {
        self.string = string
    }
}

使用方法:MyManager.shared.method()

to do

1.Kuai-Swift.h是否可以拆分

2.完善常用宏