Swift中如何为Data实例添加自定义描述信息
方案1:无需封装的Runtime关联对象方案
借助ObjC Runtime的关联对象特性,可以直接给Data实例附加自定义描述,不需要额外封装Wrapper:
import Foundation import ObjectiveC.runtime // 用静态变量地址作为关联对象的唯一key,避免键冲突 private var customDescriptionKey: UInt8 = 0 extension Data { /// 自定义业务描述字段 var customDescription: String? { get { objc_getAssociatedObject(self, &customDescriptionKey) as? String } set { objc_setAssociatedObject( self, &customDescriptionKey, newValue, .OBJC_ASSOCIATION_COPY_NONATOMIC ) } } }
使用示例:
var avatarData = Data() avatarData.customDescription = "该数据是\(user.name)的头像数据" print(avatarData.customDescription ?? "无业务描述") var encodedUserData = Data() encodedUserData.customDescription = "该数据是编码后的User实例"
注意事项:
- 该方案依赖ObjC Runtime,仅支持苹果平台
- 不会修改
Data本身的原始字节内容,也不会侵入原有Data的逻辑 - 如果需要纯Swift跨平台实现,可以选择第二种封装方案
方案2:类型安全的Wrapper封装方案
无任何依赖的纯Swift实现,性能稳定,适合生产环境使用:
struct DescribedData { let rawData: Data let businessDescription: String }
使用示例:
let avatarData = DescribedData( rawData: Data(), businessDescription: "该数据是\(user.name)的头像数据" ) // 取原始数据调用avatarData.rawData,取描述调用avatarData.businessDescription
如果需要直接兼容原有接收Data的接口,可以给DescribedData加扩展实现常用的Data方法,或者需要传参时直接取rawData属性即可。
补充可选方案:如果既不能用Runtime也不想用Wrapper,可以将描述信息编码到
Data的前缀字节中,自行约定前缀的长度和编码规则,不过该方案会修改原始Data的字节结构,需要上下游都兼容该规则才能使用。
内容的提问来源于stack exchange,提问作者rayaantaneja
相关产品推荐
相关产品推荐

