Есть ли лучшие альтернативы: Any для быстрого значения структуры? - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь реализовать приложение, в котором ответ на вызов сервера используется для построения представления. Представление может быть одного из 5 или 6 различных типов, в зависимости от возвращаемых данных, причем все они имеют разные требования к форме и типу данных, которые им передаются. Каков наилучший способ определить структуру / класс для входящих данных? Единственный способ, которым я смог до сих пор заставить это работать, это использовать: Any в качестве типа данных

Это широкие штрихи того, что я пытаюсь сделать ...

struct PageViewData {
    type: String
    id: Int
    viewData: Any
}

struct MyViewA: View {
    type: String
    id: Int
    viewData: MyViewADataShape

    var body: some View {
        //contents here
    }
}

struct MyViewADataShape {
    navigation: [NavigationItem] 
    cta: String
}

struct MyViewB: View {
    type: String
    id: Int
    viewData: MyViewBDataShape

    var body: some View {
        //contents here
    }
}

struct MyViewBDataShape {
    pageTitle: String
    author: String
    wordCount: Int
}

var serverResponse: PageViewData = fetchDataFromServer()

if(serverResponse.type == "A") {
    MyViewA(serverResponse)
}

if(serverResponse.type == "B") {
    MyViewB(serverResponse)
}

1 Ответ

1 голос
/ 08 октября 2019

Как упоминал Йонат, enum хорошо работает здесь:

struct PageView: View {
    enum Response {
        case something(DecodableResponseA)
        case orOther(DecodableResponseB)
    }

    // if you were using id + type to determine what your response was, they are
    // unnecessary now, but only you know what you were using them for
    let id: Int
    let response: Response

    var body: some View {
        self.viewForResponse(response)
    }

    private func viewForResponse(_ response: Response) -> some View {
         switch response {
         case .something(let somethingResponse): return AnyView(SomethingView())
         case .orOther(let orOtherResponse): return AnyView(OtherView())
         }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...