Swift 4 is de afgelopen maanden in de maak geweest. Als je bent zoals ik, kun je Swift Evolution volgen om op de hoogte te blijven van alle voorstellen en wijzigingen. Zelfs als u dat doet, is het nu een goed moment om alle toevoegingen en wijzigingen in de taal in deze nieuwe iteratie te bekijken.
Een momentopname van Swift 4 was al beschikbaar enkele weken voordat Xcode 9 werd aangekondigd op WWDC 2017. In dit bericht kom je alles te weten over de nieuwe functies die in Swift 4 zijn geïntroduceerd - van gloednieuwe API's tot verbeteringen in de syntaxis van de taal.
Laten we eerst eens kijken hoe u de nieuwe compiler op uw computer kunt installeren.
Er zijn twee manieren om Swift 4 uit te voeren. U kunt de Xcode 9-bèta installeren als u een ontwikkelaarsaccount hebt met toegang of u kunt Xcode 8 instellen om te worden uitgevoerd met een Swift 4-momentopname. Download in het eerste geval de bèta van de downloadpagina van uw ontwikkelaaraccount.
Als u liever Xcode 8 gebruikt, gaat u gewoon naar Swift.org om de nieuwste snapshot van Swift 4.0 Development te downloaden. Zodra de download is voltooid, Dubbelklik om het .pkg-bestand te openen, waarmee de momentopname wordt geïnstalleerd.
Schakel nu over naar Xcode en ga naar Xcode> Toolchains> Toolchains beheren. Van daar selecteert u de nieuw geïnstalleerde Swift 4.0 snapshot. Start Xcode opnieuw en nu wordt Swift 4 gebruikt bij het samenstellen van uw project of speelplaats. Merk op dat alle code die in deze tutorial wordt gepresenteerd ook beschikbaar is in een GitHub-repo.
Laten we eens kijken naar de nieuwe functies toegevoegd aan Swift 4. Een waarschuwing: de taal is nog steeds in bèta, en we zullen waarschijnlijk meer veranderingen en bugfixes zien voordat de officiële versie wordt vrijgegeven. Bovendien zijn sommige van de meest recent goedgekeurde voorstellen op dit moment nog steeds niet geïmplementeerd, dus houd toekomstige release-opmerkingen in de gaten om te zien wat er zal worden geïmplementeerd en opgelost.
JSON-parsing is een van de meest besproken onderwerpen in de Swift-community. Het is geweldig om te zien dat iemand uiteindelijk de schrijfvoorstellen SE-0166 en SE-0167 heeft verzorgd en het idee heeft opgeroepen om de API's voor archivering en serialisatie in het kader van de Foundation te vernieuwen. In Swift 4 is het niet langer nodig om uw klasse, struct of enum handmatig te ontleden of te coderen.
nieuwe codeerbaar
en Decodable
protocollen zijn toegevoegd, en je kunt je klassen eraan aanpassen door ze simpelweg toe te voegen codeerbare
(dat is een alias voor Decodeerbaar en codeerbaar
) naar de overervingslijst van de klasse. Dan kunt u de JSONEncoder
om een instantie van de klasse te coderen:
laat wwdc = Conferentie (naam: "WWDC", stad: "San Jose", datum: Datum (timeIntervalSince1970: 0)) laat jsonEncoder = JSONEncoder () laat jsonEncoded = probeer jsonEncoder.encode (wwdc) laat jsonString = String (data: jsonEncoded, encoding: .utf8) // "naam": "WWDC", "city": "San Jose", "date": - 978307200
Zoals je kunt zien, plaats je een a JSONEncoder
object om de struct naar een JSON-tekenreeksrepresentatie om te zetten. Er zijn enkele instellingen die u kunt aanpassen om het exacte JSON-formaat te krijgen dat u nodig hebt. Als u bijvoorbeeld een aangepaste datumnotatie wilt instellen, kunt u een dateEncodingStrategy
op de volgende manier:
laat jsonEncoder = JSONEncoder () laat dateFormatter = DateFormatter () dateFormatter.dateStyle = .long dateFormatter.timeStyle = .long jsonEncoder.dateEncodingStrategy laat JsonEncoded = probeer jsonEncoder.encode (wwdc) laat jsonString = String (data: jsonEncoded, encoding: .utf8) // "naam": "WWDC", "stad": "San Jose", "datum": "1 januari 1970 om 1:00:00 AM GMT + 1"
Het omgekeerde proces om een string te decoderen werkt op dezelfde manier, dankzij de JSONDecoder
klasse.
laat jsonDecoder = JSONDecoder () laten decoderenWWDC = probeer jsonDecoder.decode (Conference.self, from: jsonEncoded) // 'decodedWWDC' is al van het type Conference!
Zoals je kunt zien, door het type object door te geven aan de decoderen
methode, laten we de decoder weten welk object we terug verwachten van de JSON-gegevens. Als alles is gelukt, krijgen we een voorbeeld van ons modelobject klaar om te worden gebruikt.
Dat is niet eens de kracht en de modulariteit van de nieuwe API. In plaats van een JSONEncoder
, je kunt het nieuwe gebruiken PropertyListEncoder
en PropertyListDecoder
voor het geval dat u gegevens in een plist-bestand wilt opslaan. U kunt ook uw eigen aangepaste encoder en decoder maken. U hoeft alleen uw decoder conform te maken met de Decoder
en je encoder voor de encoder
protocol.
Als onderdeel van het String Manifesto, de Draad
type kreeg ook een vrij grote verversing. Het voldoet nu weer (na te zijn verwijderd in Swift 2) aan de Verzameling
protocol dankzij voorstel SE-0163. Dus nu kun je gewoon een string opsommen om alle karakters te krijgen.
let text: String = "Hallo van Tutsplus!" voor karakter in text.reversed () print (karakter)
substring
is een nieuw type dat overeenkomt met hetzelfde StringProtocol
waarnaar Draad
voldoet ook. U kunt een nieuwe maken substring
door gewoon in te schrijven op a Draad
. De volgende regel maakt een substring
door het eerste en laatste teken weg te laten.
laat substring = text [text.index (after: text.startIndex) ...Een leuke toevoeging die het gemakkelijker zou moeten maken om met grote stukken tekst te werken, is een meerregelige reeks. Als u een tekstblok moet maken dat over meerdere regels loopt, moest u dit eerder handmatig invoegen
\ n
overal. Dit was erg onelegant en moeilijk te beheren. Er bestaat nu een betere manier om meerregelige reeksen te schrijven, zoals u kunt zien aan de hand van het volgende voorbeeld:let welcomeMessage = "" "Hallo allemaal, welkom bij Envato Tuts +. We hopen dat je het leuk vindt om met ons te leren!" ""Er zijn weinig regels die meegaan met deze nieuwe syntaxis. Elke reeks begint met een drievoudig aanhalingsteken (
"""
). Als de hele tekenreeks is ingesprongen, bepaalt de spatiëring van de sluitende tekens de afstand die moet worden verwijderd van elke regel in de tekenreeks. Als het afsluitende teken bijvoorbeeld is ingesprongen door twee tabbladen, wordt hetzelfde bedrag uit elke regel verwijderd. Als de string een regel heeft die niet zoveel ruimte heeft, geeft de compiler een fout.Key Paths
Sleutelpaden zijn toegevoegd in Swift 3 om het gemakkelijker te maken naar eigenschappen in een object te verwijzen. In plaats van naar een objectsleutel te verwijzen met een eenvoudige letterlijke tekenreeks, kunnen sleutelpaden een controle van de compileertijd afdwingen dat een type de vereiste sleutel bevat - waardoor een veelvoorkomend type runtime-fout wordt geëlimineerd.
Sleutelpaden waren een leuke toevoeging aan Swift 3, maar hun gebruik was beperkt tot
NSObject
s en ze speelden niet echt goed met structs. Dit waren de belangrijkste drijfveren achter voorstel SE-0161 om de API te vernieuwen.De community heeft een nieuwe syntaxis goedgekeurd om een sleutelpad op te geven: het pad is geschreven met de start van een
\
. Het ziet eruit als het volgende:struct Conference var name = "" let city: String let nameKeyPath = \ Conference.name let wwdc = Conference (naam: "WWDC", stad: "San Jose") wwdc [keyPath: nameKeyPath] // "WWDC"De
nameKeyPath
object beschrijft een verwijzing naar denaam
eigendom. Het kan vervolgens worden gebruikt als een subscript op dat object.Als u de variabele wijzigt van
laat
naarvar
vanWWDC
, u kunt een specifieke eigenschap ook wijzigen via de subscriptsyntaxis van de sleutelpad.wwdc [keyPath: nameKeyPath] = "AltConf" laat naam = wwdc [keyPath: nameKeyPath] // "AltConf"Eenzijdige bereiken
SE-0172 voorgesteld om nieuwe prefix- en postfix-operators toe te voegen om te voorkomen dat een start- of eindindex onnodig wordt herhaald wanneer deze kan worden afgeleid. Als u bijvoorbeeld een array van de tweede index tot de laatste index wilt subscripten, kunt u deze op de volgende manier schrijven:
laat getallen = [-2, -1, 0, 1, 2] laat positief = getallen [2 ...Eerder, de
endIndex
moest worden gespecificeerd. Nu bestaat een kortere syntaxis:laat positief = cijfers [2 ...]Of, als u wilt beginnen met de startindex:
laat negatief = nummers [... 1]Dezelfde syntaxis kan ook worden gebruikt voor patroonvergelijking in a
schakelaar
uitspraak.Generieke subscripts
Vóór Swift 4 waren subscripts vereist om een specifiek retourwaardetype te definiëren. SE-0148 stelde de mogelijkheid voor om een enkel generiek subscript te definiëren dat het retentietype zou afleiden op basis van de gedefinieerde resultaatwaarde. Afgezien van de type-annotatie, werkt het vrijwel op dezelfde manier als voorheen.
struct Conferences let conferences: [String: Any] // Retourneert de conferentiemodellen gegeven de sleutel. subscript(sleutel: String) -> T? return conferenties [sleutel] als? T // Definieer het retourneertype van de variabele en open het object via subscript. laat ding: conferentie? = conferenties ["WWDC"] Zoals u kunt zien, verbetert dit de leesbaarheid van uw objecten in de gevallen waarin u deze via de subscriptsyntaxis moet openen..
Klasse en subtype Existentials
Een van de ontbrekende functies van het Swift-achtige systeem tot nu toe was de mogelijkheid om een klasse te beperken tot een specifiek protocol. Dit is opgelost in Swift 4 - je kunt nu het type object en de protocollen waaraan het moet voldoen, specificeren, dankzij SE-0156. U kunt bijvoorbeeld een methode schrijven die een
UIView
die voldoet aan deherlaadbaar
protocol met de volgende syntaxis:func reload (weergave: UIView & Reloadable)Woordenboek en set verbeteringen
Woordenboek
enset
kreeg ook een leuke opfrissing in Swift 4. Ze zijn veel prettiger in gebruik dankzij een paar hulpprogramma's die zijn toegevoegd.
mapValues
Woordenboek heeft nu een
mapValues
methode om alle waarden te wijzigen, waarbij het gebruik van de generieke methode wordt vermedenkaart
methode die werkt met sleutel, waarde tuples.let conferences = ["WWDC": "Very Good", "AltConf": "Good", "Firebase Party": "Very Fun"] // Kaart over alle waarden in het woordenboek. let newConferences = conferences.mapValues value in return value + "👍"
filter
RetourtypeDe
filter
methode retourneert nu een object van hetzelfde type waarmee u filtert.// Het type van deze variabele is [String: String] laat wwdc = conferences.filter $ 0.key == "WWDC"Standaardwaarden voor het opzoeken van woordenboeken
Wanneer u met woordenboeken werkt, kunt u een standaardwaarde opgeven bij het gebruik van de subscriptsyntaxis om te voorkomen dat u een optionele later moet uitpakken.
// Standaardwaarde als sleutel niet wordt gevonden. let talkShow = conferenties ["The Talk Show", standaard: "🤷♂️"]Dictionary Grouping Initializer
Eindelijk, a
Woordenboek (groepering :)
initializer is geïntroduceerd om het maken van een nieuw woordenboek te vergemakkelijken door de elementen van een bestaande verzameling te groeperen volgens een aantal criteria.In de volgende voorbeelden maken we een woordenboek door alle te groeperen
conferenties
die dezelfde startletter hebben. Het woordenboek heeft een sleutel voor elke beginletter in deconferenties
verzameling, waarbij elke waarde bestaat uit alle sleutels die met die letter beginnen.let dictionary = Dictionary (grouping: conferences.values) $ 0.uppercased (). first!Middelen
Als u geïnteresseerd bent om dieper in te gaan op de nieuwe Swift 4-functies, volgen hier nog een paar andere bronnen:
- What's New In Swift - Sessie 402 - WWDC 2017
- Apple Swift Guide
- Ole Begemann's Wat is nieuw in Swift 4 Playground
- Migratiehandleiding voor Swift 4
Conclusie
Nu u een kijkje hebt genomen naar enkele van de belangrijkste nieuwe functies in Swift 4, bent u waarschijnlijk druk bezig om ze te gaan gebruiken, om uw codebasis fris en schoon te houden. Begin met het schrijven van je nieuwe code om te profiteren van de nuttige nieuwe functies en denk na over het refactoren van sommige van je vorige code om het eenvoudiger en gemakkelijker leesbaar te maken.
Leer Swift
We hebben een complete gids samengesteld om je te helpen snel te leren, of je nu net begint met de basis of als je meer geavanceerde onderwerpen wilt verkennen.
Je kunt ook een aantal van onze andere berichten bekijken over de ontwikkeling van iOS-apps!