Yaxshi Swift dasturchisiga aylanish uchun maslahatlar

Swift, ishlab chiqaruvchilarga Objective-C kodini yanada xavfsizroq, tezkor, o'qiladigan va ishonchli hurmat qilishga yordam beradigan xususiyatlarni taqdim etadi. Mana bu yangi tilni (Swift) ishlatib tajribamiz orqali to'plagan ba'zi bir Swift maslahatlari. Ular bizga kodni yanada xavfsiz va toza yozishda yordam berishdi.

Men ushbu muhokamani ikki qismga ajratdim. Birinchisida, biz chaqqonni boshlaganlar uchun, ikkinchisida esa allaqachon ishlatayotganlar uchun muhokama qilamiz.

Yangi boshlanuvchilar uchun maslahatlar

1. Tekshirish uchun o'yin maydonchasidan foydalaning:

Har qanday mantiqiy eksperimentni o'tkazib, uni o'yin maydonchasida tasdiqlamoqchi bo'lsangiz, undan o'quv maqsadlarida foydalanish mumkin.
O'yin maydonchasi - bu tezkorlik uchun juda qulay va interfaol vosita. O'yin maydonchasi yangi loyiha yaratishi shart emas . O'yin maydonchasini yaratish uchun Xcode ishga tushirilishidan oddiy variantni tanlang:

O'yin maydonchasi Xcode ichida ham yaratilishi mumkin:

O'yin maydonchasida bo'lganingizdan so'ng, chap tomonda kodni yozishingiz mumkin va natijasi o'ng va pastki qismida bo'ladi:

2. Ixtiyoriylardan xavfsiz foydalaning:

Ixtiyoriy - bu haqiqiy qiymatga ega yoki hech narsa (nol) ga ega bo'lmagan xususiyatdir. Biz har safar ixtiyoriy ravishda chop etamiz. U qo'shimcha qiymatli matn sifatida Ixtiyoriy (value) sifatida chop etadi. Ixtiyoriy mulk nomining oxiridagi undov (!) Belgisi yordamida biz ixtiyoriy ravishda echib tashlashimiz mumkin, ammo bundan qochishimiz kerak. Bu zo'rlik bilan echib olish deb nomlanuvchi dastur buzilishiga olib keladi. Shuning uchun undov (!) Belgisini ishlatish xavflidir.

Bu erda undov (!) Belgisi ishlatiladigan alohida holat mavjud.
Masalan: IBOutlet siz interfeys quruvchisidan rozetkalarni yaratganingizda, u mutlaqo ochib berilishi mumkin emas, chunki UIKit siz rozetkangizni interfeys quruvchisiga ulaganingizni / ulaganingizni taxmin qiladi. Shunday qilib, ixtiyoriy qiymatni ochmasdan ishlatish xavfli.
Buni amalga oshirish uchun agar biz let modelidan foydalanishimiz mumkin:

var nomi: String? = "Quvonch"
var lastName: String?
chop etish (ism) // Natija: Ixtiyoriy ("Quvonch")
bosib chiqarish (ism!) // Natija: quvonch
agar ruxsat berilgan bo'lsa = name {
    bosib chiqarish
} else {
    bosib chiqarish ("nom belgilanmagan")
}
// Natija: quvonch, chunki ismning ma'nosi bor
agar lastNameNew = lastName {ga ruxsat bersangiz
    bosib chiqarish (lastNameNew)
} else {
    bosib chiqarish ("familiya belgilanmagan")
}
// Natija: familiya belgilanmagan, chunki familiya hech qanday ahamiyatga ega emas

3. Bitta fayldagi konstantalarni boshqarish:

Loyihangizning konstantalarini boshqarish uchun fayl yarating va barcha konstantalarni faqat shu erda boshqaring. Tuzilishdagi barcha doimiylarni yoki enumlarni quyidagicha tartibga soling:

enum AppConstants {
   AppName = "MyFirstApp" ga ruxsat berish
   statik let NoInternetMessage = "Kechirasiz! Internetga ulanmagan"
}

Kodni boshqarish va o'qishni qo'llab-quvvatlashga yordam beradi.
Ilova kodidagi ko'p joylarda NoInternetMessage-dan foydalanganligingizni aytamiz va endi siz xabarga ba'zi o'zgartirishlar kiritishingiz kerak, shunda siz xabarni bir joyda osongina o'zgartira olasiz, u hamma joyda avtomatik ravishda aks etadi.

4. Ichki funktsiyadan foydalanish:

Siz funktsiyani boshqa funktsiyaning tanalarida, masalan, o'rnatilgan funksiya sifatida belgilashingiz mumkin.
O'rnatilgan funktsiyalar tashqi dunyodan yashirin bo'ladi, lekin ularni yopish funktsiyasi yordamida chaqirish va ishlatish mumkin. Qoplama funktsiyasi, shuningdek, tashqi dunyoda yoki boshqa sohada foydalanish mumkin bo'lgan, o'zlarining ichki funktsiyalarini qaytarishi mumkin.
Bu sizning kodingizni o'qilishi va qayta ishlatilishini oshiradi.

funktsiyani tanlangStepFunction (orqaga: Bool) -> (Int) -> Int {
   func stepForward (kiritish: Int) -> Int {return input + 1}
   func stepBackward (kiritish: Int) -> Int {qaytish kiritish - 1}
   orqaga qaytib? stepBackward: qadamForward
}
var currentValue = -4
moveNearerToZero = tanlangStepFunction (orqaga: joriy qiymat> 0)
// moveNearerToZero endi joylashtirilgan stepForward () funktsiyasini anglatadi
whileValue! = 0 {
   bosib chiqarish ("\ (joriy qiymat) ...")
   currentValue = moveNearerToZero (currentValue)
}
bosib chiqarish ("nol!")
// Natija:
// -4 ...
// -3 ...
// -2 ...
// -1 ...
// nol!
Yigitlar uchun yana bir so'nggi maslahat, siz ham mutaxassislarning maslahatlariga murojaat qilishingiz mumkin.

Professionallar uchun maslahatlar

  1. Qo'riqchidan foydalanish:

Har qanday harakat amalga oshirilganda, siz to'g'ri ishlashi uchun u erda barcha kerakli ma'lumotlar mavjudligiga ishonch hosil qilishni xohlaysiz. Keyin keng tarqalgan ishlab chiquvchilar buni ikki yo'l bilan hal qilishdi, bular:

a. Qiyomat piramidalari:

Ishlab chiquvchi har bir kerakli ma'lumotga ishonch hosil qilishni xohlasa, foydalanilgan har bir mulkni tasdiqlaydi:

var userName: String?
var elektron pochta: String?
var parol: String?
var policyAccepted: Bool = false
func CheckAndSave () {
   agar uname = userName {ga ruxsat bersangiz
      agar pochta = elektron pochtasi bo'lsa {
         agar pwd = parol bo'lsa {
            agar policyAccepted {
               // ro'yxatdan o'tish kabi ajoyib ishni bajaring
            }
         }
      }
   }
}

Bu "Qiyomat piramidalari" deb nomlanadi, chunki biz shartlar piramidasini yaratmoqdamiz. "

b. Shartli qaytish:

Keyinchalik qiyomat piramidalarida ishlab chiquvchilar uni shartli ravishda qaytarishga, har bir ishlatilgan mulk uchun yaroqliligini va qaytishiga o'zgartirdilar:

func CheckAndSave () {
   agar uname = userName {return} bo'lsa
   agar pochta = elektron pochta orqali {qaytish}
   agar pwd = parolni {qaytarishga} ruxsat bersangiz
   agar policyAccepted {return} bo'lsa
   
   // ro'yxatdan o'tish kabi ajoyib ishni bajaring
}

Bu shartli qaytish deb nomlanadi, chunki har bir shart bajarilmasa qaytamiz.
- Birinchi echim kodni o'qish va nosozliklarni tuzatish ma'nosida yaxshi emas, shuning uchun biz bunga erishmaymiz.
- Ikkinchi yechim ham unchalik yaxshi emas, chunki keraksiz funktsiyadan qaytish kerak, shuning uchun uni biz qaytarib berdikmi?
- Yana bir yechim, agar biz ruxsat bersak, undan foydalanishimiz mumkin, ammo ba'zi bir cheklovlar mavjud, chunki o'zgaruvchilarning hajmi agar blokda bo'lsa, demak u yana qiyomat piramidasiga o'tadi.

Shunday qilib, bu erda swift 2.0-da joriy qilingan soqchilarni saqlash tushunchasi keladi. Juda oddiy va ishlatish oson, shartlar va ruxsat berilgan iboralar birgalikda ishlatilishi mumkin , quyidagicha ishlatilishi mumkin:

func CheckAndSave () {
Guard let uname = userName, mail = email ga ruxsat bering, pwd = parolga ruxsat bering, policyAccepted else {
   qaytish
}
// ro'yxatdan o'tish kabi ajoyib ishni bajaring
}

2. Kechiktirish blokidan foydalanish:

Kechiktirish - bu blok, "nima bo'lishidan qat'iy nazar keyinroq bajarishni istayman ba'zi ko'rsatmalar?" degan ma'noni anglatadi. U bitta kod satrini yoki bir nechta kod satrlarini o'z ichiga olishi mumkin. Funktsiya bajarilishi tugashi bilan aniq nomlanadigan funktsiyada biz keyinga qoldiradigan blokni aniqlay olamiz . Shuningdek, kodning ko'payishi kamayadi.
- Siz biron bir manbada biron bir ob'ektning ob'ektini yaratayotganingizni va biron bir narsani tekshirish uchun qo'riqchi kalit so'zdan foydalanganingizni yoki biron bir holatni bajarilishini qaytarganingizni aytsangiz, u holda siz resursingiz xotirada qoladi yoki funktsiyani bajarishni tugatmasdan oldin uni bo'shatishingiz kerak. Bu kodni ko'paytirishga olib keladi yoki xato bilan siz resursni xotirada qoldirishingiz mumkin . Bunday vaziyatni oldini olish uchun biz manbani bo'shatish kodini fer blokiga yozamiz. quyidagicha:

func processFile (fayl nomi: String) tashlaydi {
   agar mavjud bo'lsa (fayl nomi) {
      fayl = ochish uchun ruxsat berish (fayl nomi)
      // ochiq faylni yopish uchun bu erda defer bloki aniqlangan
      kechiktirish {
         yopish (fayl)
      }
      userName = getUserName () ga ruxsat berish
      qo'riqchi userName! = "" else {return}
      file.write (userName)
      userAge = getUserName () ga ruxsat berish
      qo'riqchi userAge> = 18 yana {qaytish}
      file.write (userAge)
      
      // close (file) bu erda, maydon oxirida chaqiriladi.
   }
}

3. kalit so'z:

Agar siz shartlarga mos keladigan naqshni ishlatmoqchi bo'lsangiz, avval tezkor holda ikkitadan alohida holda foydalanishingiz kerak bo'ladi:

var webUrl: Stringmi? = "https://medium.com"
agar yo'l bo'lsa = webUrl {
   agar path.hasPrefix ("https") {
      // ajoyib ishni qiling
   }
}

Keyinchalik, Swift 2.0 versiyasida kalit so'zni bitta bayonotda xuddi shunday qilish uchun kiritdi:

agar yo'l bo'lsa = webUrl, qaerda path.hasPrefix ("https") {
   // ajoyib ishni qiling
}

Endi Swift bu erda kalit so'zni, (vergul) belgisi bilan almashtirdi, quyidagicha:

agar yo'l = webUrl, path.hasPrefix ("https") {bo'lsa
   // ajoyib ishni qiling
}

Shunday qilib, qayerda ko'proq foydalanish kerak. Qayerda haqida ko'proq o'qing

4. Maxsus delegatsiyani kuchsizlantiring:

Kutib turing ... zaif va vakil nima? Buni aniq aniqlash uchun uni olma ishlab chiqaruvchisidan tekshirib ko'raylik.
Zaif havola bu ishora qilingan misolda kuchli ushlab turishga imkon bermaydigan ma'lumotdir va shuning uchun ARCni havola qilingan inventsiyani tarqatib yuborishni to'xtatmaydi.
Delegatsiya - bu sinf yoki tuzilishga ba'zi majburiyatlarni boshqa tur misolida berish (yoki vakolat berish) uchun imkon beradigan dizayn namunasidir.

Qachonki siz biron bir A sinfining vakilini B sinfiga tayinlasangiz, unda B sinfida A sinfiga oid kuchli ma'lumotni saqlaysiz, A klassi ham B sinfining vakili sifatida ishonchli ma'lumotni saqlab qoladi. Shunday qilib, u ob'ektlarni saqlash tsikliga o'tadi va xotira bilan bog'liq muammolar yuzaga keladi va dastur buziladi .

Shunday qilib, keyingi safar o'zingizning maxsus delegatlaringizni yaratmoqchi bo'lsangiz, ularni zaif ma'lumotnoma sifatida yaratganingizga ishonch hosil qiling,

protokol myCustomDelegation: class {
   func newFunction (vaueToBeShare: String)
}
A sinf {
   sust var delegate: myCustomDelegation?
   // ushlab qolish tsiklini buzish uchun vakilni kuchsiz qilish
}
sinf B: myCustomDelegation {
   ichki funktsiya newFunction (vaueToBeShare: String) {
      // deleg ishdan bo'shatilganida bu erda biror narsa qilish
   }
   ruxsat bering obj = A () // A sinfiga qat'iy murojaat qilish
   ташаббус () {
      obj.delegate = self // A sinfini B sinfining vakillariga tayinlash
   }
}

5. KVO-dan foydalanib qoldiring:

KVO (Key Value Observer), bu erda siz kalitning qiymati o'zgarganda istalgan tugmachani va amalni sozlashingiz va kuzatishingiz mumkin. Yaxshi, ammo tezkor yondashuv yaxshiroq, chunki biz bir muncha vaqt dasturni buzilishiga olib keladigan kuzatuvchini olib qo'yishni unutib qo'ydik yoki kuzatuvchilar har doim efirga uzatib berishdi, shuning uchun uni boshqarish juda qiyin.

Bizda KVO-ni tezda kuzatish mumkin, bu mulkni kuzatuvchidir. Buning yordamida biz mulkning qiymati o'zgarganda harakatga o'tishimiz mumkin. Bu yerda :

  • willSet qiymati saqlanishidan oldin chaqiriladi.
  • didSet yangi qiymat saqlangandan so'ng darhol chaqiriladi.
sinf yangiClass {
   var myNewObj: Int = 0 {
      willSet (newValue) {
         bosib chiqarish ("yangiValue = \ (yangiValue), oldValue = \ (myNewObj)")
      }
 
      didSet {
         bosib chiqarish ("oldValue = \ (oldValue), currentValue = \ (myNewObj)")
      }
   }
}
let obj = newClass ()
obj.myNewObj = 5
// Natija: yangiValue = 5, oldingi qiymat = 0
// Natija: oldValue = 0, joriy qiymat = 5
obj.myNewObj = 8
// Natija: yangiValue = 8, oldingi qiymat = 5
// Natija: oldingi qiymat = 5, joriy qiymat = 8

MyNewObj uchun willSet va didSet kuzatuvchilari, yangi qiymat tayinlanganda chaqiriladi. Agar yangi qiymat joriy qiymat as bilan bir xil bo'lsa ham, bu to'g'ri.

Agar siz mulkni kuzatuvchisidagi mulk1 va mulk2 mulkini kuzatuvchisida mulk1 qiymatini o'zgartirsangiz, u zanjir hosil qiladi, ish vaqtida noto'g'ri ijro etish xatosini beradi, kompilyatsiya paytida hech narsa aytilmaydi.

6. Bir nechta hikoyalar taxtasidan foydalaning:

Hikoyalar paneli tarkibiy qismlarni va ushbu ekranlar orasidagi ulanishlarni ko'rsatadigan iOS ilovasining foydalanuvchi interfeysining ingl.
Xcode sukut bo'yicha hikoyalar panelini yaratadi va ishlab chiquvchilar uni to'liq dastur uchun ishlatadilar, shuning uchun u monsterga aylanadi va Xcode-da sizning loyihangizga yuklanish vaqtini, shuningdek qurilmangizda dasturni ishga tushirish vaqtini ko'paytiradi,
Shunday qilib, ilovangizda bir nechta hikoyalar panelini yaratishga harakat qiling.

"To'liq loyiha uchun emas, balki to'liq hikoya uchun syujet taxtasidan foydalaning"

Bir nechta hikoyalar taxtasidan foydalanganda, ushbu maqolani bir nechta hikoyalar taxtasidan foydalanish to'g'risida chuqur o'qish uchun biz ko'rinishni boshqarish vositalarini ko'p jihatdan yaratamiz.
Bir nechta hikoyalar taxtasidan quyidagicha foydalanish mumkin:

yuklash AppStoryboard: satr {
   case Main = "Main"
   case PreLogin = "PreLogin"
   var misol: UIStoryboard {
      UIStoryboard-ni qaytarish (nomi: self.rawValue, to'plam: nol)
   }
}
// FOYDALANISH:
ruxsat bering storyboard = AppStoryboard.Main.instance
loginVC = AppStoryboard.PreLogin.instance.instantiateViewController-ga ruxsat berish (identifikator: "LoginVC" bilan)
// Eski yo'l
hikoya taxtasi = UIStoryboard (nom: "Asosiy", to'plam: to'plam.main)

7. Globallardan foydalanib qoldiring:

Global o'zgaruvchilar va funktsiyalardan foydalanish yaxshi amaliyot bo'lib, bizga toza kodni yaratishda va kodlarning qayta ishlatilishini oshirishda yordam beradi. Ammo men kengaytmani xuddi shu maqsadda ishlatgan ma'qul. Chunki global sinf yaratish orqali biz "GOD Class" qilamiz. Shunday qilib, kengaytmalar yordamida global sinf vazifalarini taqsimlash, kodni yanada toza, o'qish va qayta ishlatishga imkon beradi.

Yoqdi:

// O'rtacha amaliyot
func kvadrat (x: Int) -> Int {return x * x}
kvadrat3 = kvadrat (x: 3) bo'lsin // Chop etish: 9
kvadrat (x: kvadrat3) // Chop etish: 81
// Katta amaliyot
kengaytmasi Int {
   var kvadrat: Int {return self * self}
}
3.square // Chop etish: 9
3.square.square // Chop etish: 81

GitHub-dan ba'zi kengaytmalarni oling.

8. Genrics-dan foydalaning:

Generiklar o'zgaruvchini e'lon qilishga imkon beradi, bajarilishi bilan biz belgilagan turlarga tayinlanishi mumkin.

// O'rtacha amaliyot
var stateName = ["Uttar Pradesh", "Kerala", "Assam", "Panjab"]
var areaArray = [240928, 38863, 78438, 50362]
var o'sish = [20.1, 4.9, 16.9, 13.7]
func printStateName (obj: [String]) {print ("stateNames: \ (obj)")}
func printStateArea (obj: [Int]) {print ("joylar: \ (obj)")}
func printStateGrowth (obj: [Double]) {print ("populyatsiyaning o'sishi: \ (obj)")}
printStateName (obj: stateName)
printStateArea (obj: fieldArray)
printStateGrowth (obj: o'sish)
// Katta amaliyot
func printArray  (_ obj: T, xabar: String = "") {print ("\ (xabar) \ (obj)")}
printArray (holat nomi, xabar: "holatning nomi:")
printArray (maydonArray, xabar: "joylar:")
printArray (o'sish, xabar: "aholining o'sishi:")

Rahmat, o'qidingiz, iltimos, agar ushbu to'plam kabi bo'lsa, tavsiya qilish belgisini bosing