Hva er nytt i Swift 4

Swift 4 har vært i verkene de siste månedene. Hvis du er som meg, kan du følge Swift Evolution for å holde deg oppdatert med alle forslagene og endringene. Selv om du gjør det, er det nå en god tid å gjennomgå alle tilleggene og endringene i språket i denne nye iterasjonen.

Et øyeblikksbilde av Swift 4 var allerede tilgjengelig noen få uker før Xcode 9 ble annonsert på WWDC 2017. I dette innlegget lærer du alt om de nye funksjonene introdusert i Swift 4 - fra helt nye APIer til forbedringer av språk syntaksen.

La oss først se hvordan du kan få den nye kompilatoren installert på maskinen din.

Xcode Setup

Det er to måter å kjøre Swift 4. Du kan enten installere Xcode 9 beta hvis du har en utvikler konto med tilgang til det, eller du kan sette opp Xcode 8 for å kjøre med et Swift 4 stillbilde. I det forrige tilfellet laster du ned betaen fra nedlastingssiden til utviklerkontoen din.

Hvis du foretrekker å bruke Xcode 8, kan du bare gå over til Swift.org for å laste ned det nyeste snapshotet for Swift 4.0 Development. Når nedlastingen er ferdig, Dobbeltklikk å åpne .pkg-filen, som installerer øyeblikksbildet. 

Bytt til Xcode nå og gå til Xcode> Verktøykjeder> Administrer verktøylinjer. Derfra velger du det nylig installerte Swift 4.0 stillbildet. Start Xcode og nå Swift 4 vil bli brukt når du samler prosjektet eller lekeplassen. Merk at all koden som presenteres i denne opplæringen, også er tilgjengelig i en GitHub-repo.

Nye funksjoner

La oss ta en titt på de nye funksjonene som er lagt til i Swift 4. En advarsel: Språket er fortsatt i beta, og vi vil mest sannsynlig se flere endringer og feilrettinger før den offisielle versjonen slippes ut. Dessuten kan noen av de senest godkjente forslagene fortsatt ikke implementeres på dette tidspunktet, så hold øye med fremtidige utgivelsesnotater for å se hva som skal implementeres og fastsettes.

Koding og dekoding

JSON-analysering er et av de mest diskuterte emnene i Swift-fellesskapet. Det er flott å se at noen endelig tok seg av å skrive forslag SE-0166 og SE-0167 og presset ideen om å oppdatere arkiv- og serialiserings-APIene i stiftelsesrammen. I Swift 4 er det ikke lenger behov for å analysere eller kodes klassen, strukturen eller enummen manuelt. 

Ny kodbar og decodable protokoller er lagt til, og du kan gjøre klassene dine i samsvar med dem ved ganske enkelt å legge til Codable (som er et alias for Dekodable & Encodable) til klassens arvsliste. Deretter kan du bruke JSONEncoder å kode en forekomst av klassen:

la wwdc = Konferanse (navn: "WWDC", by: "San Jose", dato: Dato (timeIntervalSince1970: 0)) la jsonEncoder = JSONEncoder () la jsonEncoded = prøv jsonEncoder.encode (wwdc) la jsonString = String (data: jsonEncoded, encoding: .utf8) // "navn": "WWDC", "by": "San Jose", "dato": - 978307200

Som du kan se, ordner du en JSONEncoder objekt å konvertere strukturen til en JSON-strengrepresentasjon. Det er noen innstillinger som du kan justere for å få det eksakte JSON-formatet du trenger. For eksempel, for å angi et egendefinert datoformat, kan du spesifisere en dateEncodingStrategy på følgende måte:

la jsonEncoder = JSONEncoder () la dateFormatter = DateFormatter () dateFormatter.dateStyle = .long dateFormatter.timeStyle = .long jsonEncoder.dateEncodingStrategy = JSONEncoder.DateEncodingStrategy.formatted (dateFormatter) la jsonEncoded = prøv jsonEncoder.encode (wwdc) la jsonString = String (data: jsonEncoded, encoding: .utf8) // "navn": "WWDC", "by": "San Jose", "dato": "1. januar 1970 klokken 01:00:00 GMT + 1" 

Den omvendte prosessen for å dekode en streng fungerer på samme måte, takket være JSONDecoder klasse.

la jsonDecoder = JSONDecoder () la dekodeWWDC = prøv jsonDecoder.decode (Conference.self, from: jsonEncoded) // 'decodedWWDC' er allerede av typen Konferanse!

Som du kan se, ved å sende typen av objektet til dekode metode, lar vi dekoderen vite hvilket objekt vi forventer tilbake fra JSON-dataene. Hvis alt er vellykket, får vi en forekomst av modellobjektet som er klar til bruk.

Det er ikke engang all kraft og modulariteten til den nye API. Istedenfor å bruke en JSONEncoder, du kan bruke den nye PropertyListEncoder og PropertyListDecoder i tilfelle du trenger å lagre data i en plistfil. Du kan også lage din egen tilpassede encoder og dekoder. Du trenger bare å gjøre dekoderen din i samsvar med dekoder og din koder til giver~~POS=TRUNC protokollen.

Strings

Som en del av String Manifesto, den string type mottok også ganske stor forfriskning. Den samsvarer nå igjen (etter at den er fjernet i Swift 2) til Samling protokoll takket være forslag SE-0163. Så nå kan du bare oppregne over en streng for å få alle tegnene.

la tekst: String = "Hei fra Tutsplus!" for tegn i text.reversed () print (character)

delstreng er en ny type som stemmer overens med det samme StringProtocol til hvilken string samsvarer også. Du kan opprette en ny delstreng ved å bare abonnere a string. Følgende linje oppretter en delstreng ved å utelate den første og siste karakteren.

la substring = tekst [text.index (etter: text.startIndex) ... 

Et fint tillegg som burde gjøre det lettere å jobbe med store tekststykker, er multilinjestrenger. Hvis du må lage en tekstblokk som spenner over flere linjer, måtte du tidligere sette inn manuelt \ n over alt. Dette var veldig inelegant og vanskelig å administrere. En bedre måte eksisterer nå for å skrive flere linjestrenge, som du kan se fra følgende eksempel:

la welcomeMessage = "" "Hei der, Velkommen til Envato Tuts +. Vi håper du liker å lære med oss!" ""

Det er få regler som følger med denne nye syntaksen. Hver streng begynner med et trippel sitatmerke ("""). Så, hvis hele strengen er innrykket, bestemmer avstanden til de avsluttende tegnene avstanden som skal strippes fra hver linje i strengen. For eksempel, hvis den avsluttende karakteren er innrykket av 2 faner, vil samme beløp bli fjernet fra hver linje. Hvis strengen har en linje som ikke har denne mengden avstand, vil kompilatoren kaste en feil.

Nøkkelbaner

Nøkkelveier ble lagt til i Swift 3 for å gjøre det enklere å referere egenskaper i et objekt. I stedet for å referere til en objektnøkkel med en enkel streng-bokstav, lar vi nøkkelbaner håndheve en kompileringstid, kontroller at en type inneholder den nødvendige nøkkelen, og eliminerer en vanlig type runtime-feil. 

Nøkkelbanene var et fint tillegg til Swift 3, men bruken var begrenset til NSObjects og de spilte ikke bra med strukturer. Dette var de viktigste motivasjonene bak forslag SE-0161 for å gi API en oppdatering.

En ny syntaks ble avtalt av samfunnet for å spesifisere en nøkkelbane: banen er skrevet med start med a \. Det ser ut som følgende:

struktur konferanse var navnet = "" la byen: String la nameKeyPath = \ Conference.name la wwdc = Konferanse (navn: "WWDC", by: "San Jose") wwdc [keyPath: nameKeyPath] // "WWDC"

De nameKeyPath objekt beskriver en referanse til Navn eiendom. Den kan da brukes som et abonnement på objektet.

Hvis du endrer variabelen fra la til Var av WWDC, Du kan også endre en bestemt egenskap ved hjelp av syntetikken for nøkkelbanens abonnement.

wwdc [keyPath: nameKeyPath] = "AltConf" la navnet = wwdc [keyPath: nameKeyPath] // "AltConf"

Ensidige områder

SE-0172 foreslått å legge til nye prefiks- og postfixoperatører for å unødig gjenta en start- eller sluttindeks når det kan utledes. Hvis du for eksempel ville abonnere en matrise fra den andre indeksen helt til den siste, kan du skrive den på følgende måte:

la tall = [-2, -1, 0, 1, 2] la positive = tall [2 ... 

Tidligere, endIndex måtte spesifiseres. Nå finnes det en kortere syntaks:

la positive = tall [2 ...]

Eller, hvis du vil begynne med startindeksen:

la negativ = tall [... 1]

Den samme syntaksen kan også brukes til mønstermatching i a bytte om uttalelse.

Generiske abonnementer

Før Swift 4 ble det pålagt abonnementer å definere en bestemt returverdietype. SE-0148 foreslo muligheten til å definere et enkelt generisk abonnement som ville utlede returtypen basert på den definerte resultatverdien. Bortsett fra typen annotasjon, fungerer det ganske mye på samme måte som før.

struct Konferanser la konferanser: [String: Any] // Returnerer konferansemodellene gitt nøkkelen. senket(nøkkel: streng) -> T? returkonferanser [nøkkel] som? T // Definer returtype for variabelen og få tilgang til objektet via abonnement. la ting: konferanse? = konferanser ["WWDC"]

Som du kan se, forbedrer dette virkelig lesbarheten til objektene dine i tilfeller der du trenger tilgang til dem via abonnementssyntaxen.

Klasse- og undertypeeksistensialer

En av de manglende funksjonene fra Swift-typen til dags dato har vært i stand til å begrense en klasse til en bestemt protokoll. Dette har blitt løst i Swift 4-du kan nå angi typen av en gjenstand og protokollene som den må samsvare med, takket være SE-0156. Du kan for eksempel skrive en metode som tar en UIView som er i samsvar med reloadable protokoll med følgende syntaks:

func reload (se: UIView & Reloadable) 

Ordbok og sett forbedringer

Ordbok og Sett har også fått en fin oppdatering i Swift 4. De er mye mer behagelig å bruke takket være noen bruksmetoder som er lagt til.

mapValues

Ordboken har nå a mapValues Metode for å endre alle verdier, unngå bruk av generisk kart metode som krever å jobbe med nøkkel, verdi tuples.

la konferanser = ["WWDC": "Very Good", "AltConf": "Good", "Firebase Party": "Veldig morsomt"] // Kart over alle verdier i ordboken. la newConferences = conferences.mapValues ​​verdi i returverdi + "👍"

filter Retur Type

De filter Metoden returnerer nå et objekt av samme type du filtrerer med.

// Typen av denne variabelen er [String: String] la wwdc = conferences.filter $ 0.key == "WWDC"

Standard for Ordbokssøk

Når du arbeider med ordbøker, kan du angi en standardverdi når du bruker abonnements syntaks for å unngå å måtte pakke ut en valgfri.

// Standard verdi hvis nøkkel ikke er funnet. la talkShow = konferanser ["The Talk Show", standard: "🤷♂️"]

Ordbok Gruppering Initializer

Endelig a Dictionary (gruppering :) Initialiser er innført for å legge til rette for å lage en ny ordbok ved å gruppere elementene i en eksisterende samling i henhold til enkelte kriterier. 

I de følgende eksemplene lager vi en ordbok ved å gruppere alle sammen konferanser som har samme startbrev. Ordboken vil ha en nøkkel for hvert startbrev i konferanser samling, med hver verdi som består av alle taster som begynner med bokstaven.  

la ordbok = ordbok (gruppering: conferences.values) $ 0.uppercased (). først! 

ressurser

Hvis du er interessert i å gå dypere inn i de nye Swift 4-funksjonene, her er noen flere ressurser:

  • Hva er nytt i Swift - Session 402 - WWDC 2017
  • Apple Swift Guide
  • Ole Begemanns Hva er nytt i Swift 4 Lekeplass
  • Migreringsveiledning til Swift 4

Konklusjon

Nå som du har tatt en titt på noen av de store nye funksjonene i Swift 4, satser du sannsynligvis på litt for å begynne å bruke dem, for å holde kodebasen frisk og ren. Begynn å skrive din nye kode for å dra nytte av de nyttige nye funksjonene, og tenk på å refactoring noen av de forrige kodene dine for å gjøre det enklere og enklere å lese.

Lær Swift

Vi har bygget en komplett guide for å hjelpe deg med å lære Swift, enten du er bare i gang med det grunnleggende eller du vil utforske mer avanserte emner.

Du kan også sjekke ut noen av våre andre innlegg på IOS app utvikling!