ViewModifier — је протокол у SwiftUI-ју који омогућава креирање модификатора за вишекратну употребу за промену изгледа и понашања View. Према Apple Developer Documentation, 2024, ViewModifier захтева имплементацију методе body(content:), која прима оригинални View и враћа модификовани View, инкапсулирајући било коју комбинацију уграђених модификатора у јединствени тип. Без овог протокола, програмери би морали да понављају исте ланце модификатора на сваком месту употребе.
Главне тачке
ViewModifier — је SwiftUI протокол који дефинише уговор за креирање модификатора који се могу применити на било који тип View. Декларисан је као protocol ViewModifier { associatedtype Body: View; func body(content: Content) -> Body }, где је Content тип оригиналног View-а прослеђеног модификатору.
Протокол ViewModifier се појавио у iOS 13 заједно са првом верзијом SwiftUI-ја и остаје стабилан до iOS 18+ укључујући. Главни циљ је пружити програмерима механизам за инкапсулацију понављајућих ланаца модификатора у јединствени тип за вишекратну употребу. Без ViewModifier-а, сваки пут када би било потребно применити исти скуп стилова, морали би се ручно понављати сви модификатори.
Према Swift by Sundell (2023), ViewModifier је пожељан начин организовања стилова у SwiftUI пројектима када се исти скуп модификатора користи у три или више места. За једнократне комбинације довољан је ланац уграђених модификатора директно на View.
Протокол ViewModifier захтева имплементацију једне методе body(content:) и опционо може пружити својства за конфигурацију понашања кроз параметре иницијализатора прилагођеног модификатора.
Протокол ViewModifier дефинише методу body(content:), која прима оригинални View (тип Content) и враћа модификовани View (тип Body). SwiftUI примењује модификатор на View, прослеђујући га у content, и користи резултат за приказ.
struct CardStyle: ViewModifier {
func body(content: Content) -> some View {
content
.padding(16)
.background(Color.white)
.cornerRadius(12)
.shadow(radius: 4, x: 0, y: 2)
}
}
// Употреба:
Text("Здраво, SwiftUI!")
.modifier(CardStyle())
Када позовете .modifier(CardStyle()), SwiftUI креира инстанцу ModifiedContent<Text, CardStyle> која чува оригинални View и модификатор. При рендеровању, SwiftUI позива CardStyle.body(content: text), добијајући модификовани View са padding, background, cornerRadius и shadow.
Важна разлика: ViewModifier.body се позива при сваком ажурирању View-а, тако да унутар body не би требало да буде тешких прорачуна или нежељених ефеката. Ако модификатор зависи од спољних података (стања, окружења), проследите их кроз параметре иницијализатора.
Уграђени модификатори SwiftUI-ја (font, foregroundColor, frame, padding) — су методе проширења протокола View које враћају тип ModifiedContent. Они директно не имплементирају ViewModifier — SwiftUI користи интерне оптимизоване имплементације за сваки уграђени модификатор.
| Карактеристика | Уграђени модификатори | Прилагођени ViewModifier |
|---|---|---|
| Имплементација | Методе проширења View | Протокол ViewModifier |
| Вишекратна употреба | Једнократни ланац | Вишеструка употреба |
| Параметри | Фиксни (боја, величина) | Било који кроз иницијализатор |
| Перформансе | Максималне (интерне оптимизације) | Мало већи трошак |
| Тип повратка | ModifiedContent | ModifiedContent |
Прилагођени ViewModifier су оправдани када се иста комбинација модификатора користи у два или више места. За једнократну примену пожељнији је директни ланац модификатора — код остаје читљив, а компајлер боље оптимизује.
Према WWDC 2023, Apple препоручује креирање прилагођених ViewModifier-а за стилове повезане са дизајн системом апликације: картице, дугмад, поља за унос. Ово обезбеђује доследност и поједностављује одржавање при промени дизајна.
Образац 1: инкапсулација дизајн система. Најчешћи сценариј употребе ViewModifier-а — креирање јединственог извора истине за визуелне стилове у апликацији. Сваки елемент дизајн система (картица, дугме, наслов) добија свој модификатор.
struct PrimaryButton: ViewModifier {
var isEnabled: Bool
func body(content: Content) -> some View {
content
.font(.headline.weight(.semibold))
.foregroundColor(.white)
.padding(EdgeInsets(top: 12, leading: 24, bottom: 12, trailing: 24))
.background(isEnabled ? Color.blue : Color.gray)
.cornerRadius(8)
.opacity(isEnabled ? 1.0 : 0.6)
}
}
Образац 2: условна примена модификатора. Понекад је потребно применити модификатор само под одређеним условом. ViewModifier са буловим параметром омогућава инкапсулацију ове логике унутар body.
Образац 3: композиција модификатора. ViewModifier може применити друге ViewModifier-е унутар свог body-ја. Ово омогућава изградњу хијерархије модификатора, где сваки одговара за свој аспект визуелног приказа. На пример, CardStyle може унутра применити ShadowStyle и BorderStyle.
Према Point-Free (2024), композиција модификатора кроз ViewModifier је пожељнија од наслеђивања: сваки модификатор одговара за један задатак и могу се комбиновати независно. Ово је у складу са принципом јединствене одговорности у SwiftUI-ју.
Перформансе ViewModifier-а зависе од броја ModifiedContent омотача креираних при свакој примени. SwiftUI оптимизује ланце модификатора кроз diffing у фази рендеровања, али прекомеран број модификатора може успорити ажурирање.
| Број модификатора | Утицај на перформансе | Препорука |
|---|---|---|
| 1–5 | Минималан | Нормално за било који View |
| 5–10 | Умерен | Груписати у ViewModifier |
| 10–20 | Приметан | Објединити у један прилагођени модификатор |
| 20+ | Критичан | Преиспитати архитектуру View-а |
Оптимизација: обједините неколико узастопних модификатора истог типа (нпр. неколико padding) у један. Користите PreferenceKey само када је то заиста неопходно — модификатори који читају поставке изазивају додатни пролаз рендеровања.
Практично правило: ако View има више од 10 модификатора — преместите део њих у прилагођени ViewModifier. Ово ће побољшати читљивост и омогућити SwiftUI-ју да оптимизује ажурирања. Према SwiftUI Lab (2024), груписање модификатора у ViewModifier смањује време рендеровања за 15–30% за сложене View-ове.
Често постављана питања
ViewModifier — је протокол за креирање модификатора за вишекратну употребу који мењају изглед или понашање View. Захтева имплементацију методе body(content:), која прима оригинални View и враћа модификовани View.
Уграђени модификатори (font, padding) су методе проширења протокола View које користе интерне оптимизоване имплементације. ViewModifier је протокол за прилагођене модификаторе који инкапсулирају комбинацију уграђених и могу имати параметре иницијализатора.
Креирајте прилагођени ViewModifier када се иста комбинација модификатора користи у три или више места. За једнократне ланце користите директне модификаторе на View — то је једноставније и ефикасније.
Да, ViewModifier може садржати својства @State или @Environment. SwiftUI управља њиховим животним циклусом исто као и за View. Међутим, имајте на уму да се body позива при сваком ажурирању, зато избегавајте тешке операције у телу модификатора.
Користите if/else унутар @ViewBuilder или креирајте модификатор са буловим параметром који унутар body примењује или прескаче измене. На пример, PrimaryButton изнад користи isEnabled за условну примену стила.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође