Bailes vienkārši lēnām ieslēdzu, jo es sapratu, ka man sāk beigties šie krājuma fotoattēli

Swift + inicializācija ar slēgšanu

Slēdzēji F.T.W.

Īsa piezīme - visas manas nākamās ziņas tiks publicētas man paredzētajā vietnē, un šī publikācija vairs netiek atjaunināta. Paldies par lasīšanu

Es sāku patiešām rakt visu inicializācijas deju Sviftā. Es par to rakstīju. Es rakstīju par to, kāpēc tas darbojas pat tā, kā tas notiek. Es par to runāju. Es par to lasīju (daudz). Bet, hei, es esmu atgriezies pie vēl vienas darbības šajā jautājumā.

No visiem daudzajiem, skaistajiem un daudzveidīgajiem veidiem var kaut ko inicializēt Swift - aizvērumu izmantošana parasti netiek parādīta kā metode, kā to izdarīt. Bet diemžēl tas var padarīt boilerplatey ™ init () kodu daudz nesāpīgāku un nedaudz pārvaldāmāku.

Programmatūras lietotāja saskarnes izstrādātājiem, kas jums ir - jums tie for!

UIKit == UIHugeSetupCode ()

Skaties, tā nav UIKits vaina. Komponenti, ar kuriem lietotājam ir jāsadarbojas, var izmantot iestatīšanas koda kalnu, jo tie ir preferenciāli. Parasti to var atrast gan viewDidLoad, gan loadView:

ignorēt func loadView ()
{
    let helloWorldLbl = UILabel ()
    helloWorldLbl.text = NSLocalizedString (“controller.topLbl.helloWorld”, komentārs: “Sveika pasaule!”)
    helloWorldLbl.font = UIFont.preferredFontForTextStyle (UIFontTextStyleBody)
    helloWorldLbl.textColor = UIColor.whiteColor ()
    helloWorldLbl.textAlignment = .Center
    self.view.addSubview (helloWorldLbl)
}

Tas ir diezgan standarta tiem no mums, kuri riskē ar Cocoa Touch ūdeņiem, bez redzamības .xib vai .storyboard. Tomēr, ja jūs dalāties manā mīlestībā pret niecīgajām viewDidLoad vai loadView metodēm, varat to izvietot citur.

Sakiet, īpašums:

ļaujiet helloWorldLbl: UILabel = {
    ļaujiet lbl = UILabel ()
    lbl.text = NSLocalizedString (“controller.topLbl.helloWorld”, komentārs: “Sveika pasaule!”)
    lbl.font = UIFont.preferredFontForTextStyle (UIFontTextStyleBody)
    lbl.textColor = UIColor.whiteColor ()
    lbl.textAlignment = .Center
    atgriezties lbl
} ()

Diezgan. Apple paša grāmatā par Swift tas atzīmē, ka “ja jūsu īpašuma noklusējuma vērtībai ir nepieciešama zināma pielāgošana vai iestatīšana, varat izmantot slēgšanu vai vispārēju funkciju, lai šim īpašumam nodrošinātu pielāgotu noklusējuma vērtību.” Kā mēs tikko minējām, UIKit kontrolē ienesīgumu. daudz pielāgošanas un iestatīšanas.

Tomēr viens no glītajiem blakusproduktiem ir tas, kā loadView izskatās tagad:

ignorēt func loadView
{
    self.view.addSubview (self.helloWorldLbl)
}

Īpašuma deklarācijā tomēr ņemiet vērā atzīmi “()” slēgšanas beigās. Tas ļauj mazajiem Swift burvjiem, kas apkopo jūsu kodu, zināt, ka instance tiek piešķirta slēgšanas atgriešanas veidam. Ja mēs to izlaidīsim, iespējams, mēs būtu varējuši iestādei noteikt faktisko slēgšanu.

Un šajā gadījumā tas ir .

Noteikumi ir Noteikumi

Lai arī mums ir jauna, spīdīga rotaļlieta, noteikti jāatceras zemes noteikumi. Tā kā mēs īpašumu piešķiram slēgšanai, iespējams, ka pārējā tā saturošā instance vēl nav inicializēta. Tāpēc, kad darbība tiek slēgta, nav iespējams atsaukties uz citām īpašuma vērtībām vai sevi no tā.

Piemēram:

ļaujiet helloWorldLbl: UILabel = {
    ļaujiet lbl = UILabel ()
    lbl.text = self.someFunctionToDetermineText () // Kompilatora kļūda
    lbl.font = UIFont.preferredFontForTextStyle (UIFontTextStyleBody)
    lbl.textColor = self.myAppTheme.textColor () // Vēl viena kļūda
    lbl.textAlignment = .Center
    atgriezties lbl
} ()

Pašpietiekamības piemērs, iespējams, vēl nav droši lietojams, vai arī tas, iespējams, nav izveidots ar Swift divfāžu inicializācijas procesu. Tas pats attiecas uz visiem gadījumu īpašumiem, kurus var piešķirt vai nepiešķirt un inicializēt, jo slēgšana tiek nekavējoties izpildīta.

Tas ir atšķirīgs, bet pamatots trūkums, ja inicializēšanai tiek izmantoti aizvērēji. Tomēr tam ir pilnīga jēga - un tas ir pareizi saskaņā ar vienu no trim Swift dizaina mērķiem: drošību.

Gettin 'cute ar kolekcijām

Viena no jomām, kurā es uzskatu, ka šī tehnika ir īpaši noderīga, ir gadījumi, kas pārstāv vienu no daudzajiem Swift kolekcijas veidiem. Starp daudziem Swift talantiem šķēlēšana un kolekcionēšana, izmantojot tūkstoš titānu spēku, ir viena no manām vismīļākajām.

Apsveriet šo piemēru, kas ņemts no inicializētāja projektā, kurā šobrīd strādāju. Klasei, kurā atrodas šis kods, ir īpašnieks [Izstrādātājs]. Pēc jauna palaišanas es sākotnējās vērtības iestatīju no .plist faila. Pēc tam tie tiek glabāti, izmantojot NSKeyedArchiver.

aizsargs let devs = NSKeyedUnarchiver.unarchiveObjectWithFile (DevDataManager.ArchiveURL.path!) kā? [Izstrādātājs] cits
{
    self.developers = {
        let pListData = // Iegūstiet saraksta datus
        var devArray: [Izstrādātājs] = [Izstrādātājs] ()
        // Uzstādiet devArray no plist datiem
        atgriezt devArray.map {$ 0.setLocation ()}
                       .filter {$ 0.isRentable}
                       .sort {$ 0.name <$ 1.name}
     } ()
    atgriezties
}
self.developers = devji

Šī pieeja man ļoti patīk, jo, kaut arī mēs to neizmantojam ārpus inicializētāja, koda mērķis ir ļoti skaidrs, jo tas ir atbildīgs tikai par īpašuma iestatīšanu.

Tā kā inicializētāju un viewDidLoad ignorēšana kļūst lielāka, šādi sadalīšana (vismaz) ir laipna dāvana lasāmības ziņā.

NSCute iegūšana

Ja jūs patiešām meklējat lietas sākšanu ar slēgšanu, bet ciešat no tā, ka šīs funkcionālās dolāri netiek izmantoti kodā, uzmundrinieties. Izmantojot kādu lietpratīgu Swiftery, var izveidot kodu, kas secina tipu pašā slēgumā, kas rada zināmu pro stila konfigurāciju. Apsveriet šo kodu, ar kuru es pirmo reizi saskāros vienmēr informatīvajā NSHipster:

@warn_unused_result
public func Init  (vērtība: Tips, @noescape bloks: (objekts: Type) -> Void) -> Type
{
    bloķēt (objekts: vērtība)
    atgriešanās vērtība
}

Man patīk, kur tas notiek. Publiska funkcija, kas aizver slēgšanu ar ierakstītu objektu, izmantojot vispārīgus, kas pēc tam atgriež šo tipu. Tas nozīmē, ka jūs varētu apgriezties un iniciēt lietas ar plašāku informāciju. Tad mūsu pirmais koda paraugs savukārt izskatās šādi:

let helloWorldLbl = Init (UILabel ()) {
    $ 0.text = NSLocalizedString (“controller.topLbl.helloWorld”, komentārs: “Sveika pasaule!”)
    $ 0.font = UIFont.preferredFontForTextStyle (UIFontTextStyleBody)
    $ 0.textColor = UIColor.whiteColor ()
    $ 0.textAlignment = .Center
}

Lai arī kā tas būtu šķietami, tas patiešām samazina nepieciešamību pēc gadījuma mainīgā no slēgšanas puses un atbrīvojas no “()” prasības. Ļoti jauki .

Noslēguma domas

Varētu teikt, ka šādas tehnikas izmantošana ir seši vienā rokā, bet pusotrs - otrā. Lai gan taisnība, ka programmētāja izveidotās koda līnijas lielākoties nemainās, es uzskatu, ka tā izvietojums un elastība padara to par ideālu daudziem scenārijiem.

Tas ir jautrs veids, kā paveikt lietas, un ir pat daži veidi, kā to pašu izdarīt mūsu vecajā draugajā Objective-C. Bet hey, jo vairāk jūs zināt, amirīts?

Līdz nākamajai nedēļai = {ļaujiet nedēļai = nedēļai () nedēļai.pieaudzisBy (dienām: 7)} ()

Jordāns Morgans ir iOS programmatūras inženieris, kurš vada Dreaming In Binary

Ja jūs uzzinājāt par aizvērēju izmantošanu inicializatoros, lūdzu, nekautrējieties turpināt darbu un NSRecommend (šo, kur: zemāk);