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