Flutter 3: Dart tili Swift dasturchisi nigohida
💙 Flutter — Mobile (iOS, Android) & Desktop (macOS, Windows)
Flutter 3: Dart tili Swift dasturchisi nigohida
Holat: 2026-yil sentabr. Swift dasturchisi uchun Dart begona til emas: ikkalasi ham zamonaviy, qat'iy tiplashgan (strongly typed) va Sound Null Safety xususiyatiga ega. Ushbu darsda Swift va Dart o'rtasidagi sintaksis o'xshashliklar, farqlar (Records, Pattern Matching, Sealed Classes, Mixins) hamda asinxronlik (Isolates vs Swift Actors) amaliy kodlar bilan tahlil qilinadi.
Mundarija
- O'zgaruvchilar va konstantalar: let/var vs final/const
- Null Safety: ixtiyoriy qiymatlar bilan ishlash
- Kolleksiyalar va zamonaviy operatorlar
- Klasslar, konstruktorlar va Records
- Sealed Classes va Pattern Matching (Swift Enum alternativi)
- Protokollar, Interface va Mixin tushunchasi
- Asinxron dasturlash: Future, async/await va Stream
- Oqim modeli: Isolates vs Swift Actors & Sendable
- To'liq dasturiy namuna
- Xulosa
- Manbalar
1. O'zgaruvchilar va konstantalar: let/var vs final/const {#variables}
Swift va Dart konstantalarni belgilashda biroz farqlanadi:
| Xususiyat | Swift | Dart | Izoh |
|---|---|---|---|
| O'zgaruvchi | var x = 10 | var x = 10; | Har ikkisida ham qiymat o'zgarishi mumkin |
| Ish vaqti konstantasi | let x = calculate() | final x = calculate(); | Faqat bir marta o'rnatiladi, runtime paytida hisoblanadi |
| Kompilyatsiya konstantasi | static let x = 10 | const x = 10; | Kompilyatsiya vaqtidayoq xotirada qat'iy o'rnatiladi |
| Statik tiplash | let name: String | final String name; yoki String name = 'Ali'; | Har ikkisi statik tip nazoratiga ega |
Dart'dagi const xotirani tejash uchun juda muhim: agar ikkita widget yoki ob'ekt const bilan yaratilgan bo'lsa, ular xotirada yagona nusxada (canonicalized instance) saqlanadi.
2. Null Safety: ixtiyoriy qiymatlar bilan ishlash {#null-safety}
Dart 3.0 dan boshlab to'liq Sound Null Safety (qat'iy null xavfsizligi) ga ega. Bu Swift'dagi Optional tizimiga deyarli 100% mos keladi:
| Amal | Swift | Dart |
|---|---|---|
| Nullable tip | var name: String? | String? name; |
| Nil-coalescing (birlashuv) | let title = name ?? "Default" | final title = name ?? 'Default'; |
| Optional chaining | let count = user?.profile?.age | final count = user?.profile?.age; |
| Force unwrap (majburiy) | let res = name! | final res = name!; |
| Kechki initsializatsiya | lazy var yoki implicitly unwrapped ! | late final String token; |
Dart'dagi late kalit so'zi o'zgaruvchini darhol emas, birinchi murojaat paytida hisoblash yoki keyinroq qiymat berilishini va'da qilish uchun ishlatiladi.
3. Kolleksiyalar va zamonaviy operatorlar {#collections}
Dart kolleksiyalari (List, Set, Map) Swift'dagi Array, Set, Dictionary analogidir. Dart'da juda qulay deklarativ operatorlar mavjud:
- Collection-if: Ro'yxat ichida shart tekshirish:
[1, 2, if (isVip) 3]. - Collection-for: Ro'yxat ichida sikl aylantirish:
[for (final item in items) item.toUpperCase()]. - **Spread operator (
...va...?):** Ro'yxatni boshqa ro'yxatga yoyish (null-aware spread).
4. Klasslar, konstruktorlar va Records {#classes-records}
Swift'da struct (value type) va class (reference type) mavjud. Dart'da esa barcha sinflar reference type hisoblanadi.
Yengil ma'lumotlarni saqlash uchun Dart 3 da Records (Swift tuple analogi) joriy etildi:
void demonstrateRecords() {
final user = (name: 'Azimjon', age: 26, isLead: true);
print('${user.name}, yoshi: ${user.age}');
}
Konstruktorlarda maydonlarni e'lon qilish va bog'lash juda ixcham (this.field):
class UserModel {
final String id;
final String name;
const UserModel({required this.id, required this.name});
}
5. Sealed Classes va Pattern Matching (Swift Enum alternativi) {#sealed-classes}
Swift dasturchilari eng ko'p yaxshi ko'radigan xususiyat — bu qiymat bog'langan Enum'lardir (enum Result { case success(Data), failure(Error) }).
Dart'da bu imkoniyat **sealed class va pattern matching** orqali amalga oshiriladi:
sealed class NetworkState {
const NetworkState();
}
class Loading extends NetworkState {
const Loading();
}
class Success extends NetworkState {
final String payload;
const Success(this.payload);
}
class ErrorState extends NetworkState {
final String message;
const ErrorState(this.message);
}
// Switch ifodasi (Switch expression) — barcha holatlar to'liq qamralishi shart (exhaustive)
String renderState(NetworkState state) => switch (state) {
Loading() => 'Yuklanmoqda...',
Success(payload: final data) => 'Ma\'lumot: $data',
ErrorState(message: final err) => 'Xatolik: $err',
};
Agar siz NetworkState ning yangi vorisini qo'shsangiz va switch da uni yozmasangiz, kompilyator xatolik beradi.
6. Protokollar, Interface va Mixin tushunchasi {#protocols-mixins}
Swift'dagi protocol tushunchasi Dart'da abstract class yoki interface class sifatida ifodalanadi:
| Swift | Dart |
|---|---|
protocol Printable { func printInfo() } | abstract interface class Printable { void printInfo(); } |
protocol inheritance | class MyClass implements Printable |
protocol extension default implementation | **mixin** mexanizmi (with kalit so'zi orqali) |
Dart'da ko'p o'lchamli merosxo'rlik (multiple inheritance) yo'q, lekin Mixin orqali istalgan klassga tayyor funksionallikni ulash mumkin:
mixin Loggable {
void log(String message) {
print('[LOG]: $message');
}
}
class AnalyticsService with Loggable {
void track() {
log('Event tracked');
}
}
7. Asinxron dasturlash: Future, async/await va Stream {#concurrency}
Swift va Dart asinxronlik bo'yicha juda yaqin:
- **
Future<T>:** Swift'dagiasyncfunksiya yokiTask<T, Error>analogi. - **
Stream<T>:** Swift'dagiAsyncSequenceyoki Combine'dagiAnyPublisheranalogi.
Future<String> fetchUserData() async {
await Future<void>.delayed(const Duration(milliseconds: 100));
return 'User: Azimjon';
}
8. Oqim modeli: Isolates vs Swift Actors & Sendable {#isolates}
Bu Swift va Dart o'rtasidagi eng muhim arxitekturaviy farqdir:
- Swift (Multi-threaded & Shared Memory): Swift oqimlari umumiy xotiraga murojaat qiladi. Shuning uchun Swift 6 da poyga holatlarini (data race) to'xtatish uchun
actor,@MainActorvaSendableprotokoli kiritilgan. - Dart (Single-threaded Event Loop & Isolates): Dart kodi sukut bo'yicha bitta oqimli (Event Loop) muhitda ishlaydi. Unda bir vaqtning o'zida ikkita oqim bitta xotiraga yoza olmaydi, shuning uchun poyga xatolari deyarli bo'lmaydi.
- Og'ir hisob-kitoblar: Agar CPU'ni yuklovchi ish (JSON katta massivini parslash yoki rasmni qayta ishlash) kerak bo'lsa, Dart'da **
Isolate.run()** ishlatiladi (Dart Concurrency). Har bir Isolatening o'z xotirasi bor va ular faqat xabarlar orqali bog'lanadi.
9. To'liq dasturiy namuna {#example}
Quyidagi dastur Records, Pattern Matching, Kolleksiyalar va Sealed sinflar uyg'unligini ko'rsatadi:
sealed class FetchResult {
const FetchResult();
}
class Success extends FetchResult {
final String data;
const Success(this.data);
}
class Failure extends FetchResult {
final String error;
const Failure(this.error);
}
String handleResult(FetchResult result) => switch (result) {
Success(data: final d) => 'Muvaffaqiyat: $d',
Failure(error: final e) => 'Xatolik: $e',
};
void main() {
// 1. Records va Pattern Matching
final (name, age) = ('Azimjon', 25);
print('$name yoshi: $age');
// 2. Collection-if va spread
const hasVip = true;
final roles = ['User', if (hasVip) 'VIP', 'Moderator'];
print('Rollar: ${roles.join(", ")}');
// 3. Sealed class va pattern matching
const result = Success('Yuklandi');
print(handleResult(result));
}
Dastur natijalari:
- Records:
Azimjon yoshi: 25 - Collection-if:
Rollar: User, VIP, Moderator - Sealed class match:
Muvaffaqiyat: Yuklandi
10. Xulosa {#xulosa}
- Dart Sound Null Safety xususiyati bo'yicha Swift bilan deyarli to'liq mos keladi (
?,!,??,late). - Dart'da barcha sinflar reference type hisoblanadi; qiymatli kortejlar uchun Dart 3 Records ishlatiladi.
- Swift'dagi Associated Values'li Enum o'rniga Dart'da
sealed classva switch ifodalaridan foydalaniladi. - Mixin'lar interfeyslarga standart xatti-harakat qo'shishning eng qulay yo'lidir.
- Dart xotira xavfsizligi Event Loop va Isolates asosiga qurilgan bo'lib, umumiy xotirali ko'p oqimlilikdagi murakkab blokirovkalar talab etilmaydi.