Baimė lėtai įsitvirtino, nes supratau, kad man pradeda trūkti šių nuotraukų -

„Swift +“ inicijavimas uždarant

Uždarymai F.T.W.

Greita pastaba - visi mano būsimi įrašai bus paskelbti tam skirtoje svetainėje ir šis leidinys nebeatnaujinamas. Ačiū už skaitymą!

Aš pradedu tikrai kasti visą „Swift“ inicialų šokį. Aš apie tai rašiau. Aš rašiau apie tai, kodėl ji netgi veikia taip, kaip veikia. Aš kalbėjau apie tai. Aš apie tai skaičiau (daug). Sveiki, aš palaikau dar vieną veiksmą šiuo klausimu.

Iš visų daugelio nuostabių ir įvairių būdų galima ką nors inicijuoti „Swift“ - uždarų naudojimas paprastai nėra iškeltas kaip būdas tai padaryti. Deja, tai gali padaryti boilerplatey ™ init () kodą daug mažiau skausmingą ir šiek tiek lengviau valdomą.

Programinės vartotojo sąsajos kūrėjai - tai jums !

UIKit == UIHugeSetupCode ()

Žiūrėk, tai nėra UIKits kaltė. Komponentai, su kuriais turi bendrauti vartotojas, gali pasirinkti sąrankos kodą, nes jie yra svarbūs. Paprastai daug kas atsiduria „viewDidLoad“ arba „loadView“:

nepaisyti func loadView ()
{
    tegul helloWorldLbl = UILabel ()
    helloWorldLbl.text = NSLocalizedString („controller.topLbl.helloWorld“, komentaras: „Sveikas pasaulis!“)
    helloWorldLbl.font = UIFont.preferredFontForTextStyle (UIFontTextStyleBody)
    helloWorldLbl.textColor = UIColor.whiteColor ()
    helloWorldLbl.textAlignment = .Center
    „self.view.addSubview“ („helloWorldLbl“)
}

Tai gana įprasta tiems iš mūsų, kurie rizikuoja „Cocoa Touch“ vandenimis, neturėdami akies .xib ar .storyboard. Jei dalijatės mano meile dėl nedidelių „viewDidLoad“ ar „loadView“ metodų, galite tai pateikti kitur.

Sakyk, turtas:

tegul helloWorldLbl: UILabel = {
    tegul lbl = UILabel ()
    lbl.text = NSLocalizedString („controller.topLbl.helloWorld“, komentaras: „Sveikas pasaulis!“)
    lbl.font = UIFont.preferredFontForTextStyle (UIFontTextStyleBody)
    lbl.textColor = UIColor.whiteColor ()
    lbl.textAlignment = .Center
    grąžinti lbl
} ()

Graži. Savo „Apple“ knygoje apie „Swift“ ji pažymi, kad „jei jūsų nuosavybės numatytąją vertę reikia šiek tiek pritaikyti ar nustatyti, galite naudoti uždarymą arba visuotinę funkciją, kad pasirinktumėte numatytą šios nuosavybės vertę“. Kaip ką tik minėjome, UIKit kontroliuoja derlių. daug pritaikymų ir nustatymų.

Tačiau vienas iš nuostabių šalutinių produktų yra tai, kaip dabar atrodo „loadView“:

nepaisyti func loadView
{
    „self.view.addSubview“ („self.helloWorldLbl“)
}

Tačiau turto deklaracijoje atkreipkite dėmesį į „()“ uždarymo pabaigoje. Tai leidžia mažiesiems „Swift“ vedliams, kurie sukompiluoja jūsų kodą, žinoti, kad egzempliorius priskiriamas uždarymo grįžimo tipui. Jei to nepateiksime, įmanoma, kad egzemplioriui galėtume priskirti patį uždarymą.

Ir šiuo atveju tai yra .

Taisyklės yra taisyklės

Nors ir turime naują, blizgantį žaislą, būtina atsiminti krašto taisykles. Kadangi mes priskiriame nuosavybę uždarymui, likusi jo dalis, kurioje yra egzempliorius, galbūt dar nebuvo inicijuota. Dėl to, kai uždarymas vykdomas, neįmanoma nurodyti kitų nuosavybės vertybių ar savęs iš jos.

Pavyzdžiui:

tegul helloWorldLbl: UILabel = {
    tegul lbl = UILabel ()
    lbl.text = self.someFunctionToDetermineText () // Kompiliatoriaus klaida
    lbl.font = UIFont.preferredFontForTextStyle (UIFontTextStyleBody)
    lbl.textColor = self.myAppTheme.textColor () // Kita klaida
    lbl.textAlignment = .Center
    grąžinti lbl
} ()

Savarankiško pavyzdžio naudoti dar nėra saugu arba gali būti, kad nepavyksta su „Swift“ dviejų fazių inicijavimo procesu. Tas pats pasakytina apie bet kokias egzempliorių ypatybes, kurios gali būti paskirstomos arba negali būti inicializuotos, nes uždarymas vykdomas nedelsiant.

Tai yra aiškus, tačiau pagrįstas trūkumas, kai inicializacijai naudojami užsegimai. Vis dėlto tai yra visiškai prasminga - ir tai tiksliai atitinka vieną iš trijų „Swift“ dizaino tikslų: saugą.

Susipažink su kolekcijomis

Viena sričių, kuriose man pasirodė, kad ši technika yra ypač naudinga, yra egzemplioriai, vaizduojantys vieną iš daugelio skirtingų Swift kolekcijos formų. Iš daugelio „Swift“ talentų, pjaustyti ir perbraukti kolekciją, turinčią tūkstantį titanų, yra vienas mano mėgstamiausių.

Apsvarstykite šį pavyzdį, paimtą iš pradinio projekto iniciatoriaus, kuriame šiuo metu dirbu. Klasė, kurioje yra šis kodas, turi [kūrėjo] ypatybę. Naujai paleidęs, aš nustatiau jų pradines vertes iš .plist failo. Vėliau jie saugomi per „NSKeyedArchiver“.

sargybinis tegul devs = NSKeyedUnarchiver.unarchiveObjectWithFile (DevDataManager.ArchiveURL.path!) kaip? [Kūrėjas] dar vienas
{
    self.developers = {
        tegul pListData = // Gaukite sąrašo duomenis
        var devArray: [Kūrėjas] = [Kūrėjas] ()
        // Iš „plist“ duomenų nustatykite devArray
        return devArray.map {$ 0.setLocation ()}
                       .filteris {$ 0.isRentable}
                       .sort {{0. 0.name <$ 1.name}
     } ()
    grįžti
}
savęs vystytojai = dev

Šis požiūris man labai patinka, nes net jei mes nenaudojame jo už iniciatoriaus ribų, kodo paskirtis yra labai aiški, nes jis yra atsakingas tik už nuosavybės nustatymą.

Pradininkams ir „viewDidLoad“ nepaisant didesnių dalykų, tokių dalykų atskyrimas (bent jau) yra sveikintina dovana skaitomumo požiūriu.

Gauk NSCute

Jei jūs tikrai imate inicijuoti dalykus su užsegimu, bet kenčiate dėl to, kad nenaudojate tų funkcinių $ kodų, nudžiuginkite. Naudojant tinkamą „Swiftery“, galima sukurti kodą, kuris nustato tipą pačiame uždaryme, o tai suteikia tam tikrą pro stiliaus konfigūraciją. Apsvarstykite šį kodą, su kuriuo pirmą kartą susidūriau visada informatyviame „NSHipster“:

@warn_unused_result
public func Init  (reikšmė: Tipas, @noescape blokas: (objektas: Tipas) -> Void) -> Type
{
    blokas (objektas: vertė)
    grąžos vertė
}

Man patinka, kur tai vyksta. Viešoji funkcija, kuri užbaigia įvestą objektą, naudodama generinius vaistus, kurie grąžina tą tipą. Tai reiškia, kad jūs galite apsisukti ir inicijuoti dalykus, pateikdami daugiau tipo informacijos. Tada pirmasis mūsų kodo pavyzdys atrodytų taip:

tegul helloWorldLbl = Init (UILabel ()) {
    $ 0.text = NSLocalizedString („controller.topLbl.helloWorld“, komentaras: „Sveikas pasaulis!“)
    $ 0.font = UIFont.preferredFontForTextStyle (UIFontTextStyleBody)
    $ 0.textColor = UIColor.whiteColor ()
    $ 0.textAlignment = .Center
}

Nors jis gali atrodyti, jis iš tikrųjų panaikina egzemplioriaus kintamojo poreikį iš uždarymo pusės ir atsikrato „()“ reikalavimo. Labai gražus .

Baigiamosios mintys

Galima sakyti, kad naudojant tokią techniką yra šeši vienoje rankoje, o pusantro - kitoje. Nors tiesa, kad programuotojo sudarytos kodo eilutės iš esmės nesiskiria, aš tvirtinčiau, kad dėl išdėstymo ir lankstumo jis idealiai tinka daugeliui scenarijų.

Tai įdomus būdas viską susitvarkyti, ir yra net keletas būdų, kaip tą patį padaryti mūsų sename drauge „Objective-C“. Bet ei, kuo daugiau žinai, amiritas?

Iki nextWeek = {tegul savaitė = savaitė () savaitė. PažengusBy (dienomis: 7)} ()

Jordanas Morganas yra „iOS“ programinės įrangos inžinierius, vykdantis „Dreaming In Binary“

Jei sužinojote apie uždarymo priemonių naudojimą inicializatoriams, nedvejodami eikite į priekį ir NSRecommend (tai, kur toliau);