簡體   English   中英

協議類型'*'的值不能符合'*'; 只有結構/枚舉/類類型可以符合協議

[英]Value of protocol type '*' cannot conform to '*'; only struct/enum/class types can conform to 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)


我該如何解決? 它不應該解決具體類型嗎?

謝謝你的幫助。

您遇到了協議不符合自身的問題。 通過使applyStyle非泛型可以輕松解決您的問題,因為Style可以用作具體類型。

extension View {
    public func applyStyle(_ style: Style) {
        // USe the style here
    }
}

由於 Preset 成員樣式是 Style,而不是任何具體類型,因此您不需要 applyStyle 是通用的,您可以簡單地說:

  public func applyStyle(_ style: Style) 

嘗試

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM