协议类型'*'的值不能符合'*';只有结构/枚举/类类型可以符合协议

时间:2021-02-15 16:02:59

标签: swift swiftui swift-protocols

我在尝试此操作时遇到上述错误:

    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)


我该如何解决?不应该解析具体类型吗?

感谢您的帮助。

3 个答案:

答案 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)