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

将TypeScript的ApexAxisChartSeries转为Swift:实现多类型data属性

将TypeScript的ApexAxisChartSeries类型转换为Swift:兼容多类型数据数组

原TypeScript类型定义

type ApexAxisChartSeries = {
  data:
    | (number | null)[]
    | {
        x: any;
        y: any;
      }[]
}[]

当前已编写的Swift代码

struct ApexData {
    var x: Float
    var y: Float
}

struct ApexAxisChartSeries {
    var data: [ApexData]
}

解决方案:用枚举处理多类型数据

要让data同时兼容数字数组和对象数组,确实需要用枚举——毕竟Swift是强类型语言,没法像TypeScript那样直接用联合类型实现多类型兼容。

1. 定义枚举封装两种数据类型

先创建一个枚举,把两种数据格式都囊括进去:

enum ApexChartDataItem {
    // 对应TypeScript中的number | null类型
    case numeric(Float?)
    // 对应TypeScript中的{x,y}对象类型
    case coordinate(ApexData)
}

2. 修改ApexAxisChartSeries的data属性类型

把原来的[ApexData]替换成[ApexChartDataItem]:

struct ApexAxisChartSeries {
    var data: [ApexChartDataItem]
}

3. 实际使用示例

现在两种数据格式都能正常处理了:

// 数字数组场景
let numericSeries = ApexAxisChartSeries(
    data: [.numeric(10), .numeric(nil), .numeric(25)]
)

// 对象数组场景
let coordinateSeries = ApexAxisChartSeries(
    data: [
        .coordinate(ApexData(x: 1, y: 10)),
        .coordinate(ApexData(x: 2, y: 20))
    ]
)

可选优化:给枚举添加便捷初始化

如果想让写法更简洁,可以给枚举扩展几个初始化方法:

extension ApexChartDataItem {
    init(_ value: Float?) {
        self = .numeric(value)
    }
    
    init(x: Float, y: Float) {
        self = .coordinate(ApexData(x: x, y: y))
    }
}

// 简化后的使用方式
let simpleNumericSeries = ApexAxisChartSeries(
    data: [ApexChartDataItem(10), ApexChartDataItem(nil)]
)

let simpleCoordinateSeries = ApexAxisChartSeries(
    data: [ApexChartDataItem(x: 1, y: 10)]
)

内容的提问来源于stack exchange,提问作者János

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:10:39