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

如何优雅提取结构体枚举属性中不同类型的关联值?

解决方案

你可以通过给枚举添加计算属性或者封装处理逻辑的方法来避免每次外部写switch,同时不会产生重复存储的问题,以下是两种实用方案:

方案1:添加计算属性提取对应类型值

直接在枚举的扩展里定义可选类型的计算属性,实时提取关联值,无额外存储开销:

// 定义你的枚举和解码结构体
enum ArrayType {
    case array2D([[Float]])
    case array3D([[[Float]]])
}

struct DataStruct: Decodable {
    let enumProperty: ArrayType
}

// 给枚举添加计算属性扩展
extension ArrayType {
    var as2DArray: [[Float]]? {
        guard case .array2D(let value) = self else { return nil }
        return value
    }
    
    var as3DArray: [[[Float]]]? {
        guard case .array3D(let value) = self else { return nil }
        return value
    }
}

使用时直接用可选绑定,无需重复写switch:

let targetStruct = structArray[index]

if let array2D = targetStruct.enumProperty.as2DArray {
    // 处理二维数组逻辑
    print("2D数组长度:\(array2D.count)")
} else if let array3D = targetStruct.enumProperty.as3DArray {
    // 处理三维数组逻辑
    print("3D数组长度:\(array3D.count)")
}

方案2:封装处理逻辑的方法

如果每次都需要处理两种数组类型,可以把switch逻辑封装在枚举内部,外部通过闭包传入处理代码:

extension ArrayType {
    func handle(with on2D: ([[Float]]) -> Void, on3D: ([[[Float]]]) -> Void) {
        switch self {
        case .array2D(let value): on2D(value)
        case .array3D(let value): on3D(value)
        }
    }
}

使用时直接传入处理闭包,代码更简洁:

structArray[index].enumProperty.handle(
    on2D: { array in
        // 处理二维数组
    },
    on3D: { array in
        // 处理三维数组
    }
)

为什么不选存储可选属性?

你之前考虑的存储可选属性方案会导致数组被重复存储(枚举关联值里存一份,可选属性里再存一份),而上面两种方案都是按需提取关联值,不会额外占用内存,完全符合性能要求。

内容的提问来源于stack exchange,提问作者whaleshark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 14:25:24