Bővítmények használata (szükséges) funkciók hozzáadásához

Az Objective-C és most a Swift fantasztikus módon lehetővé teszi a programozók számára, hogy funkcionalitást adjanak bármely meglévő osztályhoz, még akkor is, ha nem férnek hozzá az eredeti forráskódhoz.

Természetesen ez a funkció néhány más nyelven is elérhető, de ebben az esetben a Swiftre fogunk összpontosítani, mert ez az Apple feltörekvő nyelve, amit történetesen szeretek.

Az egyik probléma, amellyel a közelmúltban szembesültem, egy művelet végrehajtása volt a ViewControlleren az aktuális navigációs veremből. Általában az Apple nagyon jó API-kat biztosít ehhez:

public func dismissViewControllerAnimated(flag: Bool, completion: (() -> Void)?)

Az UINavigationController esetében azonban nem volt mód a kód végrehajtására a ViewController eltávolítása után. Ez nagy problémát jelentett, mert vagy megfelelően időzítenem kellett az eltávolítást, vagy találnom kellene egy durva módot az animáció végének és a kódvégrehajtás kezdetének szinkronizálására:

public func popViewControllerAnimated(animated: Bool) -> UIViewController?

Kicsit nézelődve az interneten találtam egy érdekes kódot:

CATransaction.begin()
CATransaction.setCompletionBlock(completion)
let controller = self.popViewControllerAnimated(animated)
CATransaction.commit()

Ez pont azt a funkciót biztosította, amire szükségem volt! Indítson el egy CoreAnimation (CA) tranzakciót, állítson be egy befejezési blokkot, amely a tranzakció befejezése után fut le, majd futtassa a kódot, hogy eltávolítsa a ViewControllert a veremből.

Az érdekesség itt az, hogy ha nem a kiterjesztések, akkor újra és újra át kellett volna másolnom ezt a kódot. Ehelyett sikerült létrehoznom egy új kiterjesztést az UINavigationControllerhez, amely tartalmazza a funkciókat, nagyjából ugyanúgy, mint az Apple API-i:

UINavigationController { bővítmény

public func popViewControllerAnimált(animált: Bool, befejezés: (() -› Void)?) -› UIViewController? {
CATransaction.begin()
CATransaction.setCompletionBlock(befejezés)

let controller = self.popViewControllerAnimated(animált)

CATRAnsaction.commit()

visszatérési vezérlő

}

És tessék, ez a bővítmény csak a szükséges funkciókat biztosítja, hackelés nélkül, sőt az Apple által biztosított eredeti funkciók használatával.

Swift Tuples

A Swift másik szép funkciója a sorok. Ezek egy értékcsoport, amelyet egyetlen érték képvisel. Felfogható segítő struktúráknak, amelyeket a függvények visszatérési típusaiként használnak. És pontosan ebben segítenek, egy olyan értékcsoport gyors létrehozása, amely összefügg, de nem kell külön osztályt képviselni.

func performAction() -> (bool, string?) {
return (true, "Success")
}

Van egy másik nagyszerű használatuk, a switch utasítások. Emlékszel azokra az időkre, amikor egymásba ágyazott kapcsolók voltak? Ehelyett használhat valami ilyesmit:

switch (statusType, transactionType) {
case .Success, .Purchase:
 return "Purchase Successful"
 case .Success, .Reward:
 return "Reward Successful"
 case .Failure, _:
return "Failed Transaction"
}

Egy kapcsoló utasítás egy vagy több típus összes esetének kezelésére. Nagyon hasznos olyan helyzetekben, amikor egymáshoz kapcsolódó enumokat vagy típusokat kell egyidejűleg ellenőrizni.

Ez csak a kezdete annak, hogy mennyire hasznosak a sorok. Fantasztikusan kiegészítik nyelvi jellemzőink repertoárját.

Szerző: Ricardo Chavarría
https://pa.linkedin.com/in/ricardochavarria