Поскольку нет установщика, любая реализация body
, являющаяся типом значения, будет неизменной.var
просто означает, что body
оценивается лениво, а не изменчиво.Вы могли бы объявить let body
, но, как вы указали, это раскрывает базовую реализацию View
:
public struct StaticTextView : View {
public let body: Text
public init(string: String) {
self.body = Text(string)
}
}
Один из способов исправить это - это иметьbody
просто возвращает внутреннее приватное значение, например так:
public struct StaticTextView : View {
private let textView: Text
public var body: some View { textView }
public init(string: String) {
self.textView = Text(string)
}
}
Однако вы должны иметь в виду, что body
предназначен для динамического запуска всякий раз, когда изменяется любое из связанных состояний, и если выЕсли вы хотите присвоить ваше представление константе, ничто в иерархии этого представления не может быть привязано к какому-либо динамическому состоянию.Например, это было бы невозможно:
struct DynamicStepperView : View {
@State var stepperValue = 1
var body: some View {
Stepper(value: $stepperValue, in: 1...11, label: { Text("Current Value: \(stepperValue)") })
}
}
Если ваша главная задача - предотвратить утечку деталей реализации вашей иерархии представлений, обратите внимание, что непрозрачный тип возврата some View
действительно непрозрачен для любых клиентов.кода, и они не смогут увидеть какие-либо подробности базовой реализации, кроме того, что это некоторая вещь, которая соответствует протоколу View
.