一.swift与Objective-c混编下减小包大小

在Swift&Objective-c混编优化下,如何进一步减小代码体积大小?

二.解决方案

1.取消整个类导出Objective-c方法

例如:类只在swift模块调用的情况

1
2
@objc class STXXXXXBuilder: NSObject {
}

调整为

1
2
class STXXXXXBuilder{
}

2.取消类中非公有方法或扩展导出

1
2
3
4
5
6
7
8

/// XXXX页面
class STXXXXController: STBaseTableViewController

}
extension STXXXXController {

}

调整为

1
2
3
4

fileprivate extension STXXXXController {

}

3.取消类中部分swift方法导出Objective-c方法

例如:像UI控件,列表之类

1
2
3
4
5
6

SWIFT_CLASS("_TtC24SogouTranslatorDeveloper19STBaseTableViewCell")
@interface STBaseTableViewCell : UITableViewCell
- (nonnull instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString * _Nullable)reuseIdentifier OBJC_DESIGNATED_INITIALIZER SWIFT_AVAILABILITY(ios,introduced=3.0);
- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)coder OBJC_DESIGNATED_INITIALIZER;
@end

若STBaseTableViewCell的基类不想导出 initWithCoder和initWithStyle方法,减小文件大小,可禁止这两个方法的oc方法导出,如下所示

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13

class STXXXXCell: STBaseTableViewCell {
    
    @IBOutlet var buttons: [STXXXXButton]!
    
    @nonobjc override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    }
    
    @nonobjc required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

三.优化效果

image

四.其它

可以想下swift类中IBOutlet/IBAction为什么是导出objective-c方法的?