#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, 如下:
代码语言:javascript复制 (CGFloat)ScreenWidth{
return SCREEN_WIDTH;
}
Swift中不建议使用宏,简单的可以使用let,复杂的宏可以使用静态函数,内联函数,generics等。
Swift Style Guide
- Protocol
class MyViewController: UIViewController {
}
// MARK: - UITableViewDataSource
extension MyViewController: UITableViewDataSource {
}
// MARK: - UIScrollViewDelegate
extension MyViewController: UIScrollViewDelegate {
}
2.Optional
Use optional binding "if let"
代码语言:javascript复制if let myOptionalObject = myOptionalObject {
// do many things with myOptionalObject
}
3.[weak self] in closure
代码语言:javascript复制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)执行顺序规范
代码语言:javascript复制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 进行初始化,保证原子性,如下:
代码语言:javascript复制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.完善常用宏