You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 02:32:42