Objective-C类标记NS_REFINED_FOR_SWIFT后Swift嵌套类型实现方法
Objective-C转Swift嵌套类型的实现方案
针对你要把标记NS_REFINED_FOR_SWIFT的Objective-C类转换成Swift嵌套类型(比如MyButton.Configuration、MyButton.Configuration.Size)的需求,直接上可落地的代码方案:
一、Objective-C端代码
首先给所有需要隐藏的类加上NS_REFINED_FOR_SWIFT宏,它们在Swift中会自动被加上__前缀,变成内部可见的类:
头文件(MyButton.h)
#import <Foundation/Foundation.h> #import <UIKit/UIKit.h> // 标记后Swift中为__MyButton NS_REFINED_FOR_SWIFT @interface MyButton : NSObject @property (nonatomic, copy) NSString *title; - (void)show; @end // 标记后Swift中为__MyButtonConfiguration NS_REFINED_FOR_SWIFT @interface MyButtonConfiguration : NSObject @property (nonatomic, assign) CGFloat cornerRadius; @property (nonatomic, strong) UIColor *backgroundColor; @end // 标记后Swift中为__MyButtonConfigurationSize NS_REFINED_FOR_SWIFT @interface MyButtonConfigurationSize : NSObject @property (nonatomic, assign) CGSize minSize; @property (nonatomic, assign) CGSize maxSize; @end
实现文件(MyButton.m)
常规实现即可,无需额外处理:
#import "MyButton.h" @implementation MyButton - (void)show { NSLog(@"Button title: %@", self.title); } @end @implementation MyButtonConfiguration @end @implementation MyButtonConfigurationSize @end
二、Swift端代码
Swift不支持直接给类赋值嵌套typealias,但可以通过类扩展来实现嵌套类型的映射,完美对应你要的层级:
1. 基础类型映射
先把带__前缀的隐藏类映射成公开的顶层类型:
// 把__MyButton映射为公开的MyButton public typealias MyButton = __MyButton
2. 二级嵌套:MyButton.Configuration
给MyButton添加扩展,直接把__MyButtonConfiguration映射为它的嵌套类型Configuration:
public extension MyButton { // 让MyButton.Configuration等价于__MyButtonConfiguration typealias Configuration = __MyButtonConfiguration }
3. 三级嵌套:MyButton.Configuration.Size
给MyButton.Configuration(也就是__MyButtonConfiguration)添加扩展,映射三级嵌套类型:
public extension MyButton.Configuration { // 让MyButton.Configuration.Size等价于__MyButtonConfigurationSize typealias Size = __MyButtonConfigurationSize }
4. 使用示例
现在你可以像使用系统API一样调用:
// 创建按钮实例 let button = MyButton() button.title = "测试按钮" button.show() // 创建二级配置 let config = MyButton.Configuration() config.cornerRadius = 8 config.backgroundColor = .systemBlue // 创建三级尺寸配置 let sizeConfig = MyButton.Configuration.Size() sizeConfig.minSize = CGSize(width: 120, height: 44) sizeConfig.maxSize = CGSize(width: 240, height: 44)
三、关键注意点
- 所有Swift映射代码要放在框架的公开Swift源文件中,用
public修饰确保对外可见。 - 确保Objective-C的头文件被包含在框架的
umbrella header里,否则Swift无法访问到带__前缀的类。 - 如果需要优化Swift端的API体验,可以在扩展里给嵌套类型添加便捷初始化、方法封装,比如:
public extension MyButton.Configuration { convenience init(cornerRadius: CGFloat, bgColor: UIColor) { self.init() self.cornerRadius = cornerRadius self.backgroundColor = bgColor } }
内容的提问来源于stack exchange,提问作者HangarRash
相关产品推荐
相关产品推荐

