将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
相关产品推荐
相关产品推荐

