如何添加采用格式参数的 TableColumn 初始值设定项,以便我可以格式化列的内容?

问题描述 投票:0回答:1
public init<F>(_ titleKey: LocalizedStringKey, value: KeyPath<RowValue, String>, format: F) where F : FormatStyle, F.FormatInput : Equatable, F.FormatOutput == String {

    self.init(titleKey) { item in
        Text(item[keyPath: value], format: format)
    }
}

所以我想做类似上面的事情,但是编译器正在抱怨并且根本没有多大帮助。我不太擅长泛型,我希望有人可以向我解释这里的问题,以便我可以将该信息扔到楼上的旧工具箱中。查看文档 Apple TableColumn Docs 它说当返回类型

Label
Text
时可用,但编译器说“在
init(_:content:)
上引用初始化程序
TableColumn
要求类型 'Label' 和 'Text' 等效” ?!?

此外,“在

init(_:content:)
上引用初始化器
TableColumn
要求类型
Sort
Never
等效”

我不确定它在这里想告诉我什么。我尝试了几种不同的方法,但似乎无法编译。

即使下面的也失败了。

public init(_ titleKey: LocalizedStringKey, keyPath: KeyPath<RowValue,String>) {
    self.init(titleKey, value: keyPath)
}

但它只是说没有对 init 的确切调用。

还有

public init(_ titleKey: LocalizedStringKey, keyPath: KeyPath<RowValue,String>) {
    self.init(titleKey, value: keyPath) { item in
        Text("")
    }
}
    Compiler says: "Cannot infer type of closure parameter 'item' without a type annotation"
               "Initializer `'init(_:value:format:)'` requires that `'((_) -> Text).FormatInput'` conform to 'Equatable'"
               "Initializer `'init(_:value:format:)'` requires the types `'((_) -> Text).FormatOutput'` and 'String' be equivalent"
               "Type `'(_) -> Text'` cannot conform to `'FormatStyle'`"
swift macos generics swiftui tablecolumn
1个回答
0
投票

它说当返回类型

Label
Text
时可用,但编译器说“在
init(_:content:)
上引用初始化器
TableColumn
要求类型‘Label’和‘Text’等效”?!?

这是因为 your 初始化程序被声明为 always 可用,无论

Label
Sort
的类型如何,因此它显然无法调用要求这些类型参数为特定类型的初始化程序。

事实上,

TableColumn
有 4 个类型参数,并且您的初始化程序需要其中 3 个(除了
RowValue
之外的所有参数)进行约束,但您尚未在声明中编写任何这些约束。

您的初始化程序需要

Label == Text
Sort == Never
,如错误消息所示。它需要
Content == Text
,因为您在视图生成器中返回一个
Text(item[keyPath: value], format: format)

添加所有这些要求,您将得到:

extension TableColumn {
    public init<F>(
        _ titleKey: LocalizedStringKey,
        value: KeyPath<RowValue, F.FormatInput>, format: F
    ) where F : FormatStyle, F.FormatOutput == String, F.FormatInput: Equatable,
            Label == Text, Sort == Never, Content == Text {

        self.init(titleKey) { item in
            Text(item[keyPath: value], format: format)
        }
    }
}

(请注意,

value
应该是通往
F.FormatInput
的关键路径,而不是
String

© www.soinside.com 2019 - 2024. All rights reserved.