OC项目接入Swift踩坑记录

微信扫一扫,分享到朋友圈

OC项目接入Swift踩坑记录

#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.完善常用宏

最后打个广告,欢迎加入移动端知识星球,每日学习移动端新特性,讨论技术问题。

腾讯:给全国电竞热爱者 带来一个好消息!

上一篇

Python可视化_matplotlib08-palettable颜色库(四)

下一篇

你也可能喜欢

OC项目接入Swift踩坑记录

长按储存图像,分享给朋友