我在尝试此操作时遇到上述错误:
protocol Style {}
struct StyleA: Style {}
struct StyleA: Style {}
struct StyleA: Style {}
struct Preset: Identifiable {
let id: UUID = UUID()
let title: String
let style: Style
}
extension View {
public func applyStyle<S>(_ style: S) where S : Style {
// USe the style here
}
}
// Initializg the data
static let mockedData: [Preset] = [
.init(title: "Title A", style: StyleA()),
.init(title: "Title A", style: StyleB()),
.init(title: "Title A", style: StyleC()),
]
// This line gives the error
myView.applyStyle(mockedData.first!.style)
我该如何解决?不应该解析具体类型吗?
感谢您的帮助。
答案 0 :(得分:1)
您遇到了 protocols not conforming to themselves 的问题。您的问题可以通过使 applyStyle
成为非泛型来轻松解决,因为 Style
可以用作具体类型。
extension View {
public func applyStyle(_ style: Style) {
// USe the style here
}
}
答案 1 :(得分:0)
由于 Preset 成员样式是 Style,而不是任何具体类型,因此您不需要 applyStyle 是通用的,您可以简单地说:
public func applyStyle(_ style: Style)
答案 2 :(得分:0)
试试
public protocol Style {}
struct StyleA: Style {}
struct StyleB: Style {}
struct StyleC: Style {}
struct Preset: Identifiable {
let id: UUID = UUID()
let title: String
let style: Style
}
extension View {
public func applyStyle(_ style: Style){
// USe the style here
}
}
// Initializg the data
let mockedData: [Preset] = [
.init(title: "Title A", style: StyleA()),
.init(title: "Title A", style: StyleB()),
.init(title: "Title A", style: StyleC()),
]
myView.applyStyle(mockedData.first!.style)