ViewModifier — SwiftUI-də View-in görünüşünü və davranışını dəyişdirmək üçün təkrar istifadə oluna bilən modifikatorlar yaratmağa imkan verən protokoldur. Apple Developer Documentation, 2024-ə görə, ViewModifier orijinal View-i qəbul edən və dəyişdirilmiş View-i qaytaran body(content:) metodunun tətbiqini tələb edir və daxili modifikatorların istənilən kombinasiyasını vahid tipdə kapsullaşdırır. Bu protokol olmadan tərtibatçılar eyni modifikator zəncirlərini hər istifadə yerində təkrarlamalı olardılar.
Əsas məqamlar
ViewModifier — istənilən View tipinə tətbiq oluna bilən modifikatorlar yaratmaq üçün müqavilə müəyyən edən SwiftUI protokoludur. O, protocol ViewModifier { associatedtype Body: View; func body(content: Content) -> Body } kimi elan edilmişdir, burada Content modifikatora ötürülən orijinal View-in tipidir.
ViewModifier protokolu iOS 13-də SwiftUI-nin ilk versiyası ilə birlikdə meydana çıxdı və iOS 18+ daxil olmaqla stabil olaraq qalır. Əsas məqsəd tərtibatçılara təkrarlanan modifikator zəncirlərini vahid təkrar istifadə oluna bilən tipdə kapsullaşdırmaq mexanizmi təqdim etməkdir. ViewModifier olmadan hər dəfə eyni stil dəstini tətbiq etmək lazım gəldikdə bütün modifikatorları əl ilə təkrarlamaq məcburiyyəti yaranardı.
Swift by Sundell (2023)-ə görə, ViewModifier eyni modifikator dəsti üç və daha çox yerdə istifadə edildikdə SwiftUI layihələrində stilləri təşkil etməyin üstünlük verilən üsuludur. Tək istifadəlik kombinasiyalar üçün birbaşa View-də daxili modifikatorlar zənciri kifayətdir.
ViewModifier protokolu bir body(content:) metodunun tətbiqini tələb edir və isteğe bağlı olaraq xüsusi modifikatorun init parametrləri vasitəsilə davranışı konfiqurasiya etmək üçün xüsusiyyətlər təmin edə bilər.
ViewModifier protokolu orijinal View-i (Content tipi) qəbul edən və dəyişdirilmiş View-i (Body tipi) qaytaran body(content:) metodunu müəyyən edir. SwiftUI modifikatoru View-ə tətbiq edir, onu content-ə ötürür və nəticədən göstərmək üçün istifadə edir.
struct CardStyle: ViewModifier {
func body(content: Content) -> some View {
content
.padding(16)
.background(Color.white)
.cornerRadius(12)
.shadow(radius: 4, x: 0, y: 2)
}
}
// İstifadə:
Text("Salam, SwiftUI!")
.modifier(CardStyle())
.modifier(CardStyle()) çağırdıqda, SwiftUI orijinal View və modifikatoru saxlayan ModifiedContent<Text, CardStyle> nümunəsi yaradır. Render zamanı SwiftUI CardStyle.body(content: text)-i çağırır, padding, background, cornerRadius və shadow ilə dəyişdirilmiş View əldə edir.
Əhəmiyyətli fərq: ViewModifier.body hər View yenilənməsində çağırılır, ona görə də body daxilində ağır hesablamalar və ya yan təsirlər olmamalıdır. Modifikator xarici məlumatlardan (vəziyyət, mühit) asılıdırsa, onları init parametrləri vasitəsilə ötürün.
SwiftUI-nin daxili modifikatorları (font, foregroundColor, frame, padding) — ModifiedContent tipini qaytaran View protokolunun genişləndirmə metodlarıdır. Onlar birbaşa ViewModifier-i tətbiq etmir — SwiftUI hər daxili modifikator üçün daxili optimallaşdırılmış tətbiqlərdən istifadə edir.
| Xüsusiyyət | Daxili modifikatorlar | Xüsusi ViewModifier |
|---|---|---|
| Tətbiq | View genişləndirmə metodları | ViewModifier protokolu |
| Təkrar istifadə | Tək istifadəlik zəncir | Çoxsaylı istifadə |
| Parametrlər | Sabit (rəng, ölçü) | Init vasitəsilə istənilən |
| Performans | Maksimum (daxili optimallaşdırmalar) | Bir qədər yüksək yük |
| Qaytarma tipi | ModifiedContent | ModifiedContent |
Xüsusi ViewModifier eyni modifikator kombinasiyası iki və ya daha çox yerdə istifadə edildikdə əsaslandırılır. Tək istifadə üçün birbaşa modifikator zənciri üstünlük təşkil edir — kod oxunaqlı qalır və kompilyator daha yaxşı optimallaşdırır.
WWDC 2023-ə görə, Apple tətbiqin dizayn sistemi ilə əlaqəli stillər (kartlar, düymələr, giriş sahələri) üçün xüsusi ViewModifier yaratmağı tövsiyə edir. Bu, vahidliyi təmin edir və dizayn dəyişikliklərində texniki xidməti asanlaşdırır.
Nümunə 1: dizayn sisteminin kapsullaşdırılması. ViewModifier-in ən çox yayılmış istifadə ssenarisi — tətbiqdə vizual stillər üçün vahid həqiqət mənbəyi yaratmaqdır. Dizayn sisteminin hər bir elementi (kart, düymə, başlıq) öz modifikatorunu alır.
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)
}
}
Nümunə 2: modifikatorun şərti tətbiqi. Bəzən modifikatoru yalnız müəyyən şərtdə tətbiq etmək lazım gəlir. Boolean parametrli ViewModifier bu məntiqi body daxilində kapsullaşdırmağa imkan verir.
Nümunə 3: modifikatorların kompozisiyası. ViewModifier öz body-si daxilində digər ViewModifier-ləri tətbiq edə bilər. Bu, hər biri vizual təqdimatın öz aspektinə cavabdeh olan modifikatorlar iyerarxiyası qurmağa imkan verir. Məsələn, CardStyle daxildə ShadowStyle və BorderStyle tətbiq edə bilər.
Point-Free (2024)-ə görə, ViewModifier vasitəsilə modifikatorların kompozisiyası mirasdan üstündür: hər modifikator bir tapşırığa cavabdehdir və onlar müstəqil birləşdirilə bilər. Bu, SwiftUI-də tək məsuliyyət prinsipinə uyğundur.
ViewModifier-in performansı hər tətbiqdə yaradılan ModifiedContent qablaşdırmalarının sayından asılıdır. SwiftUI render mərhələsində diffing vasitəsilə modifikator zəncirlərini optimallaşdırır, lakin həddindən artıq modifikator sayı yenilənməni yavaşlada bilər.
| Modifikator sayı | Performansa təsir | Tövsiyə |
|---|---|---|
| 1–5 | Minimal | İstənilən View üçün normal |
| 5–10 | Orta | ViewModifier-də qruplaşdırmaq |
| 10–20 | Nəzərə çarpan | Bir xüsusi modifikatorda birləşdirmək |
| 20+ | Kritik | View arxitekturasını yenidən nəzərdən keçirmək |
Optimallaşdırma: eyni tipli bir neçə ardıcıl modifikatoru (məsələn, bir neçə padding) birinə birləşdirin. PreferenceKey-dən yalnız həqiqətən zəruri olduqda istifadə edin — üstünlükləri oxuyan modifikatorlar əlavə render keçidinə səbəb olur.
Praktik qayda: View-də 10-dan çox modifikator varsa — onların bir hissəsini xüsusi ViewModifier-ə çıxarın. Bu, oxunaqlılığı yaxşılaşdıracaq və SwiftUI-ə yenilənmələri optimallaşdırmağa imkan verəcək. SwiftUI Lab (2024)-ə görə, modifikatorların ViewModifier-də qruplaşdırılması mürəkkəb View-lər üçün render müddətini 15–30% azaldır.
Tez-tez verilən suallar
ViewModifier — View-in görünüşünü və ya davranışını dəyişdirən təkrar istifadə oluna bilən modifikatorlar yaratmaq üçün protokoldur. O, orijinal View-i qəbul edən və dəyişdirilmiş View-i qaytaran body(content:) metodunun tətbiqini tələb edir.
Daxili modifikatorlar (font, padding) — daxili optimallaşdırılmış tətbiqlərdən istifadə edən View protokolunun genişləndirmə metodlarıdır. ViewModifier daxili modifikatorların kombinasiyasını kapsullaşdıran və init parametrlərinə malik ola bilən xüsusi modifikatorlar üçün protokoldur.
Eyni modifikator kombinasiyası üç və daha çox yerdə istifadə edildikdə xüsusi ViewModifier yaradın. Tək istifadəlik zəncirlər üçün birbaşa View modifikatorlarından istifadə edin — bu daha sadə və səmərəlidir.
Bəli, ViewModifier @State və ya @Environment xüsusiyyətləri ehtiva edə bilər. SwiftUI onların həyat dövrünü View-də olduğu kimi idarə edir. Bununla belə, body hər yenilənmədə çağırılır, ona görə də modifikatorun gövdəsində ağır əməliyyatlardan çəkinin.
@ViewBuilder daxilində if/else istifadə edin və ya body daxilində dəyişiklikləri tətbiq edən və ya atlayan boolean parametrli modifikator yaradın. Məsələn, yuxarıdakı PrimaryButton stili şərti tətbiq etmək üçün isEnabled istifadə edir.
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