A félelem lassan beindult, amikor rájöttem, hogy elfogyok ezek a stock fotók

Swift + inicializálás bezárásokkal

Lezárások F.T.W.

Rövid megjegyzés - az összes jövőbeli hozzászólásomat közzéterem a dedikált webhelyemön, és ez a kiadvány már nem frissül. Köszönöm, hogy elolvasta!

Már kezdtem valóban ásni az egész inicializációs táncot Swift-ben. Írtam róla. Azt írtam, hogy miért működik úgy, ahogy van. Beszéltem rajta. (Sokat) olvastam róla. De hé, visszatérek egy további cselekedetre az ügyben.

A sok, gyönyörű és változatos módszer közül valamit inicializálható Swift-ben - a záróelemek használata általában nem merül fel módszerként. De sajnos ez a boilerplatey ™ init () kódot sokkal kevésbé fájdalmassá és könnyebben kezelhetővé teszi.

A programozó felhasználói felület fejlesztői számára - ez az Ön számára !

UIKit == UIHugeSetupCode ()

Nézd, nem az UIKits hibája. Azok az összetevők, amelyekkel a felhasználónak kölcsönhatásba kell lépnie, a beállítási kód hegyéhez vezetnek, mert a preferenciák. Általában ezek nagy része a viewDidLoad vagy a loadView oldalán található:

felülbírálja a func loadView ()
{
    hagyja, hogy helloWorldLbl = UILabel ()
    helloWorldLbl.text = NSLocalizedString (“controller.topLbl.helloWorld”, megjegyzés: “Hello World!”)
    helloWorldLbl.font = UIFont.preferredFontForTextStyle (UIFontTextStyleBody)
    helloWorldLbl.textColor = UIColor.whiteColor ()
    helloWorldLbl.textAlignment = .Center
    self.view.addSubview (helloWorldLbl)
}

Ez meglehetősen szabvány azok számára, akik a Cocoa Touch vizeit kockáztatják .xib vagy .storyboard nézet nélkül. Ugyanakkor, ha megosztja az iránti szeretettel a apróbb viewDidLoad vagy loadView módszereket, akkor ezt máshol el is teheti.

Mondja: ingatlan

had hello helloWorldLbl: UILabel = {
    legyen lbl = UILabel ()
    lbl.text = NSLocalizedString (“controller.topLbl.helloWorld”, megjegyzés: “Hello World!”)
    lbl.font = UIFont.preferredFontForTextStyle (UIFontTextStyleBody)
    lbl.textColor = UIColor.whiteColor ()
    lbl.textAlignment = .Center
    visszatér lbl
} ()

Szép. Az Apple saját Swift-könyvében megjegyzi, hogy „ha az ingatlan alapértelmezett értéke valamilyen testreszabást vagy beállítást igényel, akkor zárást vagy globális függvényt használhat az adott tulajdonság testreszabott alapértelmezett értékének biztosításához.” Mint már említettük, az UIKit ellenőrzi a hozamot. sok testreszabás és beállítás.

Az egyik szép melléktermék azonban az, hogy a loadView hogyan néz ki most:

felülbírálja a func loadView alkalmazást
{
    self.view.addSubview (self.helloWorldLbl)
}

Vegye figyelembe azonban a vagyonnyilatkozatban a bezárás végén található „()” jelet. Ez lehetővé teszi, hogy a kódot összeállító kis Swift varázslók megtudják, hogy a példányt a bezárás visszatérési típusához rendelik. Ha ezt kihagynánk, akkor valószínűleg magát a tényleges bezárást is hozzárendelhetjük volna a példányhoz.

És ebben az esetben ez az .

A szabályok szabályok

Annak ellenére, hogy van egy fényes új játékunk, feltétlenül emlékezni kell a föld szabályaira. Mivel egy tulajdonságot rendelünk egy bezáráshoz, valószínű, hogy a többi példányt még nem inicializáltuk. Emiatt, amikor a bezárás végrehajtódik - nem lehet hivatkozni más tulajdonsági értékekre vagy önmagára belülről.

Például:

had hello helloWorldLbl: UILabel = {
    legyen lbl = UILabel ()
    lbl.text = self.someFunctionToDetermineText () // Összeállítási hiba
    lbl.font = UIFont.preferredFontForTextStyle (UIFontTextStyleBody)
    lbl.textColor = self.myAppTheme.textColor () // Egy másik hiba
    lbl.textAlignment = .Center
    visszatér lbl
} ()

Előfordulhat, hogy az én példánya még nem biztonságos a használata, vagy előfordulhat, hogy nem teljesül a Swift kétfázisú inicializálási folyamatával. Ugyanez igaz a példánytulajdonságokra, amelyeket el lehet osztani vagy inicializálni lehet, mivel a bezárás azonnal végrehajtódik.

Ez egyértelmű, de indokolt hátrány, ha az inicializáláshoz záróelemeket használunk. Ennek azonban teljesen értelme van - és pontosan összhangban áll a Swift három tervezési céljával: biztonság.

Gettin aranyos gyűjtemények

Az egyik terület, ahol ezt a technikát különösen hasznosnak találtam, azokkal az esetekkel foglalkozik, amelyek a gyűjtemény sokféle változatának egyikét képviselik Swiftben. A Swift sok tehetsége közül a gyűjtemény és a szétvágás ezer titán erejével áll az egyik legnépszerűbbem.

Vegyük figyelembe a következő példát, amely egy inicializálóból származik egy olyan projektben, amelyen jelenleg dolgozom. Az a osztály, amelyben ez a kód található, rendelkezik egy [Fejlesztő] tulajdonsággal. Egy új indításkor a kezdeti értékeket egy .plist fájlból állítottam be. Ezután ezeket az NSKeyedArchiver segítségével tárolják.

őr hadd devs = NSKeyedUnarchiver.unarchiveObjectWithFile (DevDataManager.ArchiveURL.path!) as? [Fejlesztő] más
{
    self.developers = {
        hadd pListData = // Kérjen plist adatokat
        var devArray: [Fejlesztő] = [Fejlesztő] ()
        // A devArray beállítása plist adatokból
        return devArray.map {$ 0.setLocation ()}
                       .filter {$ 0.isRentable}
                       .sort {$ 0.name <$ 1.name}
     } ()
    Visszatérés
}
self.developers = devs

Nagyon tetszik ez a megközelítés, mert bár nem az inicializálón kívül használjuk, a kód szándéka nagyon egyértelmű, mivel kizárólag a tulajdonság beállításáért felel.

Ahogy az inicializálók és a viewDidLoad felülbírálások nagyobbá válnak, az ilyen dolgok elválasztása (legalábbis) az olvashatóság szempontjából üdvözlendõ ajándék.

NSCute megszerzése

Ha tényleg ásni kezdi a dolgokat egy bezárással, de attól szenved, hogy nem használják ezeket a funkcionális dollárokat a kódban, akkor élvezze fel. Néhány hozzáértő Swiftery segítségével elkészíthetünk egy kódot, amely maga a bezárásban következteti be a típust, ami bizonyos stílusú konfigurációt eredményez. Fontolja meg ezt a kódot, amelyet először találkoztam a mindig informatív NSHipsterrel:

@warn_unused_result
public func Init  (érték: Típus, @noescape blokk: (objektum: Típus) -> Érvénytelen) -> Típus
{
    blokk (objektum: érték)
    visszatérési érték
}

Szeretem, hol megy ez. Nyilvános függvény, amely bezárást vesz igénybe gépelt objektummal generikus felhasználással, amely ezt a típust adja vissza. Ez azt jelenti, hogy megfordulhat és inicializálhat dolgokat több típusú információval. Az első kódmintánk ezután viszont így néz ki:

hagyja, hogy helloWorldLbl = Init (UILabel ()) {
    $ 0.text = NSLocalizedString (“controller.topLbl.helloWorld”, megjegyzés: “Hello World!”)
    $ 0.font = UIFont.preferredFontForTextStyle (UIFontTextStyleBody)
    $ 0.textColor = UIColor.whiteColor ()
    $ 0.textAlignment = .Center
}

Fantasztikus, bár úgy tűnik, valóban megszabadítja a példányváltozó szükségességét a bezárásból, és megszabadul a „()” követelménytől. Nagyon szép .

Végső gondolatok

Azt mondhatnánk, hogy egy ilyen technika használata az egyik kezében hat, a másikban pedig fél tucat. Noha igaz, hogy a programozó által készített kódsorok nagyrészt változatlanok, azt állítom, hogy elhelyezése és rugalmassága sokféle forgatókönyv számára ideális.

Ez egy szórakoztató módszer a dolgok elkészítésére, és van még néhány módszer arra is, hogy ugyanezt megcsináljuk régi Object-C barátunkban. De hé, minél többet tudsz, amirite?

Következő héthéig = {hagyja, hogy hét = hét () hét. Továbbfejlesztett (nap: 7)} ()

Jordan Morgan egy iOS szoftvermérnök, aki a Dreaming In Binary programot üzemelteti

Ha megtudta a bezárások használatát az inicializálók számára, kérjük, bátran lépjen tovább, és NSRecommend (ez, ahol: lent);