Самодостаточный родовой - PullRequest
       0

Самодостаточный родовой

1 голос
/ 07 февраля 2020

У меня есть следующий протокол:

public protocol ImagesContainer {
    associatedtype ImageName: RawRepresentable where ImageName.RawValue == String
    static var bundle: Bundle? { get }
}

с реализацией, подобной этой

struct ImagesMain: ImagesContainer {
    public static var bundle: Bundle? { return .main }
    public enum ImageName: String {
        case loading, success, error
        case profile, address
    }
}

struct ImagesUser: ImagesContainer {
    public static var bundle: Bundle? { return .main }
    public enum ImageName: String {
        case profile, address, country
    }
}

, поэтому обычно я использовал это в структурах модели

struct ViewModel {
    let icon: ImagesMain.ImageName
}

что хорошо для одного ImagesContainer. Но у меня есть один такой контейнер для каждого пакета, и я хотел бы смешивать и сопоставлять их при создании этих моделей представления. На данный момент они всегда привязаны к одному ImagesContainer. Я хотел бы обобщить это, так что я могу указать любой ImageName из любого ImagesContainer.

что-то вроде

struct ViewModel {
    let profileIcon<T: ImagesContainer>: (T, T.ImageName)
    let addressIcon<T: ImagesContainer>: (T, T.ImageName)

}

Я не могу поместить это в саму структуру, потому что там может быть несколько свойств с различными ImagesContainer с и так далее. Есть ли способ получить автономный дженерик c?

1 Ответ

0 голосов
/ 19 марта 2020

Для всех, кто заинтересован в решении, вот то, что я придумал.

public protocol ImageAsset {
    func image() -> UIImage
}

private struct DefaultImageAsset<T: ImageAssetsContainer>: ImageAsset {
    let container: T.Type
    let imageName: T.ImageName

    init(_ container: T.Type, _ imageName: T.ImageName) {
        self.container = container
        self.imageName = imageName
    }

    func image() -> UIImage {
        return container.image(imageName)
    }
}

, поэтому фактический лог c находится внутри структуры, а тип не передается извне:

struct ViewModel {
    let profileIcon: ImageAsset
    let addressIcon: ImageAsset
}

let viewModel = ViewModel(
     profilesIcon: DefaultImageAsset(ImagesMain.self, .profile),
     addressIcon: DefaultImageAsset(ImagesUser.self, .address)
)

viewModel.profilesIcon.image()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...