Почему Self.Content
- это typealias
, а Self.Body
- это associatedtype
? Какая разница?
Поскольку Content
- это typealias
, автор протокола ViewModifier
может выбрать тип, которому назначается псевдоним, когда она пишет протокол. (Вы не можете увидеть псевдоним типа, потому что это тип _ViewModifier_Content<Self>
. Когда идентификатор в SDK начинается с _
, Apple опускает идентификатор из документации и сгенерированных интерфейсов.)
Поскольку Body
- это associatedtype
, вы можете выбрать тип, которому он является псевдонимом, когда вы пишете тип, соответствующий протоколу ViewModifier
. Вы можете сделать Body
любым типом, который захотите, при соблюдении двух условий:
Вы должны выбрать тип, соответствующий View
(поскольку протокол ViewModifier
ограничивает Body
соответствие View
).
У вас должна быть возможность создать или получить экземпляр любого выбранного типа, потому что вы должны вернуть его из метода body
. (Или вы можете разбиться или зависнуть, чтобы вообще не возвращаться, но обычно это не то, что вам нужно ...)
Итак, когда вы реализуете тип, соответствующий ViewModifier
, вы не можете повлиять на то, что Content
означает. Это всегда означает _ViewModifier_Content<Self>
. Но вы можете выбрать, что означает Body
, выбрав тип возврата метода body
.
Вот я заставлю Body
означать EmptyView
:
struct EmptyModifier: ViewModifier {
func body(content: Content) -> EmptyView {
EmptyView()
}
}
И здесь я заставлю Body
означать Color
:
struct RedModifier: ViewModifier {
func body(content: Content) -> Color {
Color.red
}
}
Обычно мы используем some View
в качестве типа, что означает, что Swift определяет для нас точный тип и хранит его в секрете:
struct FrameModifier: ViewModifier {
var color: Color
var width: CGFloat
func body(content: Content) -> some View {
return content
.padding(width)
.border(color, width: width)
}
}
Здесь все, что мы знаем о типе Body
, это то, что он соответствует View
. Swift изрядно пытается помешать нам узнать настоящий тип во время компиляции.
person
rob mayoff
schedule
10.09.2020
Body
будет выведен из вашего возврата, поэтому это связанный тип,Content
будет предоставлен вам, он известен ViewModifer (потому что сгенерирован им), но скрыт для вас, так это typealias. - person Asperi   schedule 10.09.2020