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'`"
它说当返回类型
为Label
时可用,但编译器说“在Text
上引用初始化器init(_:content:)
要求类型‘Label’和‘Text’等效”?!?TableColumn
这是因为 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
)