.modifier() — SwiftUI-də View protokolunun metodudur, istənilən View növünə xüsusi ViewModifier nümunəsini tətbiq edir. Apple Developer Documentation, 2024-a görə, metod ViewModifier qəbul edir və ModifiedContent qaytarır, orijinal View-i dəyişdirilmiş versiyaya bükərək. Sabit parametrləri olan genişləndirmə metodları olan daxili modifikatorlardan fərqli olaraq, .modifier() ViewModifier protokolunu həyata keçirən tipdə kapsullaşdırılmış istənilən xüsusi məntiqdən istifadə etməyə imkan verir.
Əsas qeydlər
.modifier() — View protokolunda elan edilmiş metoddur: func modifier<M: ViewModifier>(_ modifier: M) -> ModifiedContent<Self, M>. O, ViewModifier-i həyata keçirən tip nümunəsini qəbul edir və ModifiedContent tipinə bükülmüş dəyişdirilmiş View qaytarır.
Metod iOS 13-də ortaya çıxdı və SwiftUI-də xüsusi modifikatorların tətbiqinin əsas üsuludur. Birbaşa View-də çağırılan daxili modifikatorlardan (font, foregroundColor, frame) fərqli olaraq, .modifier() əvvəlcədən modifikator tipinin yaradılmasını tələb edir. Bu bir abstraksiya səviyyəsi əlavə edir, lakin təkrar istifadə və parametrləşdirmə imkanları açır.
Hacking with Swift (2024) məlumatlarına görə, .modifier() təkrarlanan UI elementləri üçün vahid stil tələb olunan hər SwiftUI layihəsində istifadə olunur. Metod daxili modifikatorlar zənciri ilə müqayisədə əlavə yük yaratmır — kompilyator çağırışı optimallaşdırır.
modifier metodu ViewModifier protokolu ilə məhdudlaşdırılmış M generik parametrini qəbul edir. Generiklər sayəsində kompilyator modifikatorun konkret tipini bilir və tip silinməsi (type erasure) olmadan nəticə View tipini optimallaşdıra bilir.
modifier(_:) metodu orijinal View-i (Self) ötürülən modifikatorla (M) birləşdirən ModifiedContent nümunəsi yaradır. Render edərkən SwiftUI M.body(content: self) çağırır, orijinal View-i content parametri kimi ötürür.
struct RoundedBorder: ViewModifier {
let color: Color
let width: CGFloat
func body(content: Content) -> some View {
content
.padding(8)
.overlay(
RoundedRectangle(cornerRadius: 8)
.stroke(color, lineWidth: width)
)
}
}
// .modifier() vasitəsilə tətbiq:
Text("Salam")
.modifier(RoundedBorder(color: .blue, width: 2))
// Ekvivalent birbaşa zəncir:
Text("Salam")
.padding(8)
.overlay(
RoundedRectangle(cornerRadius: 8)
.stroke(Color.blue, lineWidth: 2)
)
Tətbiq ardıcıllığı: modifikatorlar xaricdən daxilə tətbiq olunur. İlk .modifier() çağırışı View-i xaricdən bükür, ikincisi — birincinin üstündə və s. Bu, kompozisiyada vacibdir — ardıcıllıq vizual nəticəyə təsir edir.
Apple WWDC 2022 məlumatlarına görə, SwiftUI ModifiedContent iyerarxiyasında dəyişiklikləri müəyyən etmək üçün Identity əsaslı diffinqdən istifadə edir. Modifikator tipi (M) View identity-nin formalaşmasında iştirak edir, buna görə də müxtəlif modifikator tipləri həmişə yeni identity yaradır, hətta vizual nəticə eyni olsa belə.
SwiftUI-nin daxili modifikatorları — View protokolunda elan edilmiş genişləndirmə metodlarıdır. Hər bir daxili modifikator (font, foregroundColor, padding) Apple tərəfindən optimallaşdırılmış öz daxili tətbiqinə malikdir. Onlar ViewModifier protokolundan istifadə etmir və .modifier() vasitəsilə çağırılmır.
| Xüsusiyyət | .modifier() | Daxili modifikatorlar |
|---|---|---|
| Protokol | ViewModifier | View genişləndirmə metodları |
| Təkrar istifadə | İstənilən sayda | Kodun təkrarlanması tələb olunur |
| Parametrləşdirmə | İnisializator vasitəsilə | Sabit parametrlər |
| Qruplaşdırma | Bir neçə modifikator bir yerdə | Hər biri ayrılıqda |
| Performans | Müqayisə edilə bilən | Maksimum |
.modifier() nə vaxt istifadə olunmalı: eyni modifikator kombinasiyası tətbiqin bir neçə yerində tətbiq edildikdə. Bu, stil üçün vahid mənbə təmin edir və refaktorinqi asanlaşdırır. Birbaşa modifikatorlar nə vaxt istifadə olunmalı: konkret View üçün xüsusi olan birdəfəlik tətbiqlər üçün.
Objc.io (2023) məlumatlarına görə, .modifier() və daxili modifikatorlar zənciri arasında performans fərqi statistik əhəmiyyətsizdir (render vaxtının 1%-dən az). Seçim performansla deyil, oxunaqlılıq və təkrar istifadə ilə müəyyən edilməlidir.
Modifikatorun şərti tətbiqi — SwiftUI-də tez-tez rast gəlinən tapşırıqlardan biridir. Üçlü operator vasitəsilə standart yanaşma .modifier() ilə işləmir, çünki müxtəlif modifikator tipləri müxtəlif ModifiedContent tiplərinə gətirib çıxarır.
// ❌ Kompilyasiya olunmur — fərqli modifikator tipləri:
var body: some View {
Text("Şərti")
.modifier(isActive ? HighlightStyle() : DefaultStyle())
}
// ✅ Düzgün: @ViewBuilder daxilində if/else:
@ViewBuilder
var body: some View {
if isActive {
Text("Şərti").modifier(HighlightStyle())
} else {
Text("Şərti").modifier(DefaultStyle())
}
}
// ✅ Və ya parametrli modifikator:
struct ConditionalStyle: ViewModifier {
let isActive: Bool
func body(content: Content) -> some View {
content
.foregroundColor(isActive ? .blue : .gray)
.opacity(isActive ? 1.0 : 0.5)
}
}
Text("Şərti").modifier(ConditionalStyle(isActive: isActive))
Tövsiyə: sadə şərtlər üçün (göstər/gizlət, rəngi dəyiş) parametrli modifikatordan istifadə edin. Mürəkkəb şərti məntiq üçün müxtəlif modifikator dəstləri ilə — @ViewBuilder daxilində if/else. İkinci yanaşma daha oxunaqlıdır, lakin kodun təkrarlanmasına səbəb ola bilər.
Modifikatorlar zənciri — bir View-ə tətbiq edilən .modifier() və daxili modifikatorların çağırışları ardıcıllığıdır. Hər çağırış yeni bükülmə qatı yaradır və bütün qatlar iç-içə generiklər vasitəsilə vahid View tipində birləşir.
SwiftUI modifikatorlar zəncirini təmsil etmək üçün tip sistemindən istifadə edir. Məsələn, Text().font(.title).padding()-in tipi ModifiedContent<ModifiedContent<Text, _FontModifier>, _PaddingLayout>. Hər daxili modifikatorun tərtibatçıdan gizlədilmiş öz daxili modifikator strukturu var.
Tip problemi: ModifiedContent tiplərinin dərin iç-içəliyi kompilasiyanı ləngidir və xəta mesajlarını çətinləşdirir. Xüsusi ViewModifier bir neçə qatı “bir” yerə yığmağa, nəticə tipini sadələşdirməyə və kompilasiya sürətini yaxşılaşdırmağa imkan verir. Swift Compiler Team (2024) məlumatlarına görə, 5–7 ardıcıl modifikatoru bir ViewModifier ilə əvəz etmək mürəkkəb View-lər üçün kompilasiya vaxtını 10–20% qısaldır.
Praktiki qayda: View 8-dən çox modifikatordan istifadə edirsə — bir hissəsini xüsusi ViewModifier-ə çıxarın. Bu, kompilasiyanı sürətləndirəcək və oxunaqlılığı yaxşılaşdıracaq.
Tez-tez verilən suallar
.modifier() View-ə xüsusi ViewModifier tətbiq edir, ModifiedContent qaytarır. Bu, ViewModifier protokolu vasitəsilə yaradılmış istifadəçi modifikatorlarından istifadənin əsas üsulu və daxili modifikatorların birbaşa zəncirlərinə alternativdir.
.modifier() ViewModifier protokolunun nümunəsini qəbul edir, istənilən dəyişiklik kombinasiyasını kapsullaşdırmağa imkan verir. Daxili modifikatorlar (font, padding) — sabit məntiqi olan View genişləndirmə metodlarıdır. Performans fərqi minimaldır, seçim təkrar istifadə ilə müəyyən edilir.
Bəli, if/else vasitəsilə @ViewBuilder daxilində və ya boolean parametrli modifikator vasitəsilə. Birbaşa üçlü operator müxtəlif ModifiedContent tipləri səbəbindən işləmir. Sadə şərtlər üçün parametrli yanaşma, mürəkkəb məntiq üçün if/else tövsiyə olunur.
Modifikatorlar xaricdən daxilə tətbiq olunur: ilk .modifier() View-i xaricdən bükür, sonrakılar — üstündə. Ardıcıllıq vizual nəticəyə təsir edir, xüsusən overlay, padding və frame ilə işləyərkən.
Təsir statistik əhəmiyyətsizdir (render vaxtının 1%-dən az). Üstəlik, bir neçə modifikatoru bir ViewModifier-də qruplaşdırmaq ModifiedContent qatlarının sayını azaltmaqla və tipi kompilyator üçün sadələşdirməklə performansı yaxşılaşdıra bilər.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun