Download uw gratis exemplaar van
The Missing Manual
for Swift Development

the Guide I Wish I Had When I Started Out

Word lid van meer dan 20.000 ontwikkelaars die leren over Swift-ontwikkeling

Download uw gratis exemplaar

Als u dit bekijkt, neem ik aan dat u bekend bent met Swift-extensies. Met een Swift-extensie kunt u functionaliteit toevoegen aan een type, Een klasse, een struct, een enum of een protocol. Maar extensies zijn krachtiger dan dat. In deze aflevering wil ik jullie vier slimme toepassingen van Swift-extensies laten zien.

Protocol conformiteit

de Swift – programmeertaal vermeldt dat uitbreidingen kunnen worden gebruikt om een bestaand type aan een protocol te voldoen. Hoewel dit niet nieuw of revolutionair is, kan het u ook helpen uw code georganiseerd te houden.

neem de protocollen UITableViewDataSource en UITableViewDelegate als voorbeeld. Dit voorbeeld komt me bekend voor. Dit is prima, maar het resulteert in een lange klasse implementatie die moeilijk kan worden om te navigeren in de tijd.

import UIKitclass ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { ...}

u kunt uw code georganiseerd houden door een extensie aan te maken voor elk protocol waaraan het type voldoet.

import UIKitclass ViewController: UIViewController { ...}extension ViewController: UITableViewDataSource { ...}extension ViewController: UITableViewDelegate { ...}

het navigeren door bronbestanden wordt ook gemakkelijker als u de springbalk bovenaan de bronbewerker van Xcode gebruikt.

het navigeren door bronbestanden wordt ook gemakkelijker als u de springbalk bovenaan de bronbewerker van Xcode gebruikt.

behoud van Initializers

ik leerde de volgende truc van Chris Eidhof. In dit voorbeeld moeten we eerst een structuur definiëren, Person. De structuur definieert twee constante eigenschappen van het type String, first en last.

struct Person { // MARK: - Properties let first: String let last: String}

Swift creëert genereus een initializer voor ons, init(first:last:), die we kunnen gebruiken om een instantie van de Person structuur te instantiëren. Dit is niet nieuw.

let john = Person(first: "John", last: "Doe")

helaas is de initializer niet langer beschikbaar als we een aangepaste initializer definiëren in de definitie van de struct.

struct Person { // MARK: - Properties let first: String let last: String // MARK: - Initialization init(dictionary: ) { self.first = dictionary ?? "John" self.last = dictionary ?? "Doe" }}

de initializer is niet langer beschikbaar als we een aangepaste initializer definiëren in de structuurdefinitie.

gelukkig hebben we een eenvoudige oplossing om dit probleem op te lossen. We maken een extensie voor de Person struct waarin we de aangepaste initializer definiëren.

struct Person { // MARK: - Properties let first: String let last: String}extension Person { // MARK: - Initialization init(dictionary: ) { self.first = dictionary ?? "John" self.last = dictionary ?? "Doe" }}

een uitbreiding lost het probleem op.

Codescheiding

we kunnen het vorige voorbeeld nog een stap verder zetten. Een paar jaar geleden, Natasha Murashev schetste een techniek die extensies gebruikt om staat te scheiden van gedrag. Als we deze techniek toepassen op het vorige voorbeeld, eindigen we met iets als dit.

struct Person { // MARK: - Properties let first: String let last: String}extension Person { // MARK: - Initialization init(dictionary: ) { self.first = dictionary ?? "John" self.last = dictionary ?? "Doe" } // MARK: - Public API var asDictionary: { return }}

de typedefinitie definieert alleen de opgeslagen eigenschappen. Een extensie wordt gemaakt voor het gedrag van het type, dat wil zeggen, methoden en berekende eigenschappen. Het resultaat is een duidelijke scheiding van toestand (opgeslagen eigenschappen) en gedrag (methoden en berekende eigenschappen).

we kunnen nog een stap verder gaan door een tweede private extensie te maken voor privé gedrag.

struct Person { // MARK: - Properties let first: String let last: String}extension Person { ...}private extension Person { ...}

Code scheiding en organisatie is zeer eenvoudig te doen met extensies. Ik gebruik het de hele tijd. Als je de headerbestanden van Objective-C mist, dan is dit een mooi alternatief.

geneste typen

de Swift-programmeertaal vermeldt dat Extensies u ook toelaten geneste typen te definiëren en te gebruiken. Maar ik vind deze functie ondergewaardeerd. Ik gebruik het bijvoorbeeld in elk Swift-project om constanten te definiëren.

een paar maanden geleden publiceerde ik een tutorial over het bouwen van een aangepaste controle met behulp van een bitmasker. In die tutorial slaan we de ruwe waarde van het bitmasker op in de standaarddatabase van de gebruiker.

// MARK: - [email protected] func scheduleDidChange(_ sender: SchedulePicker) { // Helpers let userDefaults = UserDefaults.standard // Store Value let scheduleRawValue = sender.schedule.rawValue userDefaults.set(scheduleRawValue, forKey: UserDefaults.Keys.schedule)}

in plaats van een letterlijke tekenreeks te gebruiken, gebruiken we een constante. We maken een extensie voor de klasse UserDefaults waarin we een enum zonder cases definiëren, Keys. Het enum definieert één statische constante eigenschap van het type String, schedule.

extension UserDefaults { enum Keys { static let schedule = "schedule" }}

het resultaat is vrij mooi als je het mij vraagt. Niet alleen kunnen we constanten groeperen, het vermijden van literalen die verspreid zijn over de codebase, we ook namespace de constanten. Met andere woorden, de constanten zijn gemakkelijk te onthouden en zinvol.

UserDefaults.Keys.schedule

met de release van Swift 3 nam Apple een soortgelijke techniek in sommige van zijn kaders.

Notification.Name.UIApplicationWillTerminate

What ‘ S Next

extensies zijn vrij krachtig in Swift en de technieken die ik in deze handleiding liet zien zijn slechts een paar voorbeelden van wat mogelijk is.

download uw gratis exemplaar van
The Missing Manual
for Swift Development

the Guide I Wish I Had When I Started Out

meer dan 20.000 ontwikkelaars leren over Swift-ontwikkeling

Download uw gratis exemplaar

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.