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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:32:43