SwiftUI中BarMark调用泛型函数出现Swift6编译警告的解决方法
解决SwiftUI Chart中BarMark参数函数的Swift 6警告问题
我正在构建SwiftUI Chart,希望BarMark的x和y参数调用私有函数。相关代码如下:
Chart { ForEach(array) { data in BarMark(x: x(data), y: y(data)) .foregroundStyle(.blue.gradient) } } // array是[MyStruct]类型,data为该数组的元素,类型是MyStruct // MyStruct是自定义结构体,包含date(Date类型)和value(Double类型)属性 private func x<T: Plottable>(_ data: MyStruct) -> PlottableValue<T> where T == Date { .value("Date", data.date, unit: .day) } private func y<T: Plottable>(_ data: MyStruct) -> PlottableValue<T> where T == Double { .value("Steps", data.value) }
当前代码可运行,但x()和y()函数出现Swift 6编译警告:Same-type requirement makes generic parameter 'T' non-generic; this is an error in Swift 6,需要消除该警告。
解决方案
问题根源在于你给函数添加了不必要的泛型约束——where T == Date和where T == Double已经把泛型参数T固定为单一类型,泛型在这里完全没有存在的意义。直接移除泛型声明,指定具体的返回类型即可:
Chart { ForEach(array) { data in BarMark(x: x(data), y: y(data)) .foregroundStyle(.blue.gradient) } } // array是[MyStruct]类型,data为该数组的元素,类型是MyStruct // MyStruct是自定义结构体,包含date(Date类型)和value(Double类型)属性 private func x(_ data: MyStruct) -> PlottableValue<Date> { .value("Date", data.date, unit: .day) } private func y(_ data: MyStruct) -> PlottableValue<Double> { .value("Steps", data.value) }
说明
- 移除了函数的泛型声明
<T: Plottable>以及对应的where约束,因为我们明确知道返回的是PlottableValue<Date>和PlottableValue<Double>,泛型在这里属于冗余设计。 - 直接指定具体的返回类型,既符合Swift 6的语法规范,也让代码逻辑更清晰直观。
内容的提问来源于stack exchange,提问作者Tony Tompos
相关产品推荐
相关产品推荐

