Протокол с методом, возвращающим тип View - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь добиться некоторого полиморфизма при построении видов в swiftui:

Примерно так:

protocol Builder {
    func viewForItem() -> View
}

extension ItemPhoto: Builder {
    public func viewForItem() -> View {
        Image("image.png")
    }
}

Я получаю сообщение об ошибке:

Protocol 'View' can only be used as a generic constraint because it has Self or associated type requirements

Если я попробуйте использовать associatedtype У меня есть следующая проблема

protocol Builder {
    associatedtype T
    func viewForItem() -> T
}


extension ItemPhoto: Builder {
    typealias T = Image

    public func viewForItem() -> Image {
        Image("image.png").scaledToFit()
    }
}

Если я хочу сделать любое представление здания, я получаю ошибку

Cannot convert return expression of type 'some View' to return type 'Image'

1 Ответ

2 голосов
/ 03 мая 2020

Вот решение. Протестировано с Xcode 11.4 / iOS 13.4

protocol Builder {
    associatedtype T:View    // << not exact, but just a View !!
    func viewForItem() -> T
}

struct ItemPhoto { // << just for testing
}

extension ItemPhoto: Builder {

    public func viewForItem() -> some View { // opaque !!
        Image("image.png").scaledToFit()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...