Как разделить модификаторы представления на вызываемые / включаемые структуры - PullRequest
0 голосов
/ 05 августа 2020

У меня есть случай, когда определенный модификатор вида используется во всем виде. Можно ли вместо повторения этого кода снова и снова сделать его вызываемым? Модификатор .foreground сам по себе не имеет контекста, так как он не является автономным синтаксисом .....

struct ColorTheme: View {
    
    @ObservedObject var userSettings = UserSettings()
    
    var body: some View {
        .foregroundColor( ((userSettings.mapType == "Satellite") ||  Error: Cannot infer contextual base in reference to member 'foregroundColor'
            (userSettings.mapType == "Hybrid") ||
            (userSettings.mapStyle == "AssassinsCreed") ||
            (userSettings.mapStyle == "Aubergine")  ||
            (userSettings.mapStyle == "Dark")  ||
            (userSettings.mapStyle == "MidnightCommand")  ||
            (userSettings.mapStyle == "Night")) ? Color(UIColor.white) : Color(UIColor.black))
    }
}

1 Ответ

1 голос
/ 05 августа 2020

Вы можете попробовать следующее:

class UserSettings: ObservableObject {
    @Published var mapType: String = "Satellite"
    
    var fgColor: Color {
        switch mapType {
        case "Satellite", "Hybrid", "AssassinsCreed", "Aubergine", "Dark", "MidnightCommand", "Night":
            return Color(UIColor.white)
        default:
            return Color(UIColor.black)
        }
    }
}

struct ColorTheme: View {
    
    @ObservedObject var userSettings = UserSettings()
    
    var body: some View {
        Text("test")
            .foregroundColor(userSettings.fgColor)
    }
}

Вы также можете рассмотреть возможность создания mapType an enum .

РЕДАКТИРОВАТЬ

Возможно, вы ищете расширение просмотра:

extension View {
    @ViewBuilder
    func customFgColor(mapType: String) -> some View {
        switch mapType {
        case "Satellite", "Hybrid", "AssassinsCreed", "Aubergine", "Dark", "MidnightCommand", "Night":
            return self.foregroundColor(Color(UIColor.white))
        default:
            return self.foregroundColor(Color(UIColor.black))
        }
    }
}

struct ColorTheme: View {
    @ObservedObject var userSettings = UserSettings()

    var body: some View {
        Text("test")
            .customFgColor(mapType: userSettings.mapType)
    }
}
...