Swift 4 har varit i arbetet de senaste månaderna. Om du är som jag, kan du följa Swift Evolution för att hålla dig uppdaterad med alla förslag och ändringar. Även om du gör det, är det nu dags att granska alla tillägg och ändringar i språket i den här nya iterationen.
En snapshot av Swift 4 var redan tillgänglig några veckor innan Xcode 9 meddelades vid WWDC 2017. I det här inlägget lär du dig information om de nya funktionerna som introduceras i Swift 4-från helt nya API till förbättringar av språksyntaxen.
Låt oss först se hur du kan få den nya kompilatorn installerad på din maskin.
Det finns två sätt att köra Swift 4. Du kan antingen installera Xcode 9 beta om du har ett utvecklare konto med åtkomst till det eller du kan konfigurera Xcode 8 för att köras med en Swift 4 stillbild. I det förra fallet ladda ner betaversionen från din nedladdningssida för utvecklarkonto.
Om du föredrar att använda Xcode 8, gå helt enkelt till Swift.org för att ladda ner den senaste Snabbhotsutvecklingen för Swift 4.0. När nedladdningen är klar, dubbelklicka för att öppna .pkg-filen, vilken installerar ögonblicksbilden.
Byt till Xcode nu och gå till Xcode> Verktygskedjor> Hantera Verktygskedjor. Därifrån väljer du den nyinstallerade Swift 4.0 stillbilden. Starta om Xcode och nu används Swift 4 när du sammanställer ditt projekt eller lekplats. Observera att all kod som presenteras i denna handledning finns också i ett GitHub repo.
Låt oss ta en titt på de nya funktionerna som läggs till i Swift 4. Ett försök: Språket är fortfarande i beta, och vi kommer troligtvis se fler ändringar och buggfixar innan den officiella versionen släpps. Dessutom kan några av de senast godkända förslagen fortfarande inte genomföras på den här tiden, så håll ögonen på framtida noteringar för att se vad som ska genomföras och fastställas.
JSON-analysering är ett av de mest diskuterade ämnena i Swift community. Det är kul att se till att någon äntligen tog hand om att skriva förslag SE-0166 och SE-0167 och drivit tanken att uppdatera arkiv- och serialiserings-API: erna i stiftelsens ramverk. I Swift 4 finns det inte längre något behov av att analysera eller koda din klass, struktur eller enum manuellt.
Ny kodbar
och avkodas
protokoll har lagts till och du kan göra dina klasser förenliga med dem genom att helt enkelt lägga till kodbar
(vilket är ett alias för Decodable & Encodable
) till klassens arvslista. Då kan du använda JSONEncoder
att koda en förekomst av klassen:
låt wwdc = Konferens (namn: "WWDC", stad: "San Jose", datum: Datum (timeIntervalSince1970: 0)) låt jsonEncoder = JSONEncoder () låt jsonEncoded = försök jsonEncoder.encode (wwdc) låt jsonString = String (data: jsonEncoded, encoding: .utf8) // "namn": "WWDC", "city": "San Jose", "datum": - 978307200
Som du kan se, ordnar du en JSONEncoder
objekt att konvertera strukturen till en JSON-strängrepresentation. Det finns några inställningar som du kan tweak för att få det exakta JSON-formatet du behöver. Om du t.ex. vill ange ett anpassat datumformat kan du ange en dateEncodingStrategy
på följande sätt:
låt jsonEncoder = JSONEncoder () låt dateFormatter = DateFormatter () dateFormatter.dateStyle = .long dateFormatter.timeStyle = .long jsonEncoder.dateEncodingStrategy = JSONEncoder.DateEncodingStrategy.formatted (dateFormatter) låt jsonEncoded = försök jsonEncoder.encode (wwdc) låt jsonString = String (data: jsonEncoded, encoding: .utf8) // "namn": "WWDC", "city": "San Jose", "datum": "1 januari 1970 kl. 13:00 GMT + 1"
Den omvända processen att avkoda en sträng fungerar på samma sätt, tack vare JSONDecoder
klass.
låt jsonDecoder = JSONDecoder () låt deodasWWDC = försök jsonDecoder.decode (Conference.self, från: jsonEncoded) // 'decodedWWDC' är redan typ av konferens!
Som du kan se, genom att överföra objektets typ till avkoda
metod, vi låter avkodaren veta vilket objekt vi förväntar oss tillbaka från JSON-data. Om allt är framgångsrikt får vi en förekomst av vårt modellobjekt redo att användas.
Det är inte ens all kraft och modularitet för det nya API. I stället för att använda en JSONEncoder
, du kan använda det nya PropertyListEncoder
och PropertyListDecoder
om du behöver lagra data i en plistfil. Du kan också skapa din egen anpassade kodare och avkodare. Du behöver bara göra din avkodare i enlighet med Avkodare
och din kodare till Encoder
protokoll.
Som en del av String Manifesto, den Sträng
typ fick också en ganska stor uppdatering. Den överensstämmer nu igen (efter att ha tagits bort i Swift 2) till Samling
protokoll tack vare förslag SE-0163. Så nu kan du enkelt räkna över en sträng för att få alla tecken.
låt text: String = "Hej från Tutsplus!" för tecken i text.reversed () skriv ut (tecken)
träng
är en ny typ som överensstämmer med samma StringProtocol
till vilken Sträng
överensstämmer också. Du kan skapa en ny träng
genom att bara prenumerera a Sträng
. Följande rad skapar en träng
genom att utelämna första och sista tecknet.
låt substring = text [text.index (efter: text.startIndex) ...Ett fint tillägg som ska göra det enklare att arbeta med stora bitar av text är flera linjesträngar. Om du måste skapa ett textblock som sträcker sig över flera rader, måste du tidigare infoga manuellt
\ n
över hela stället. Detta var mycket oregelbundet och svårt att hantera. Ett bättre sätt finns nu att skriva flera linjesträngar, vilket du kan se från följande exempel:låt WelcomeMessage = "" "Hej där, Välkommen till Envato Tuts +. Vi hoppas att du gillar att lära oss!" "Det finns få regler som följer med den nya syntaxen. Varje sträng börjar med ett trippelnoteringsmärke (
"""
). Då, om hela strängen är indragad, bestämmer avståndet för de slutliga karaktärerna avståndet som ska avlägsnas från varje rad i strängen. Om till exempel stängnings tecknet indrycks av 2 flikar, kommer samma mängd att tas bort från varje rad. Om strängen har en rad som inte har denna mängd avstånd, kommer kompilatorn att kasta ett fel.Nyckelvägar
Viktiga vägar läggs till i Swift 3 för att göra det enklare att referera egenskaper i ett objekt. Istället för att hänvisa till en objektnyckel med en enkel sträng bokstavlig, låter vi väga en kompileringstid som kontrollerar att en typ innehåller den nödvändiga nyckeln, vilket eliminerar en vanlig typ av runtime-fel.
Viktiga vägar var ett bra komplement till Swift 3, men deras användning var begränsad till
NSObject
s och de spelade inte riktigt bra med strukturer. Dessa var huvudmotiven bakom förslag SE-0161 för att ge API en uppdatering.En ny syntax överenskommits av samhället för att ange en nyckelväg: sökvägen är skriven med början av a
\
. Det ser ut som följande:struct-konferens var name = "" låt staden: String låt nameKeyPath = \ Conference.name låt wwdc = Konferens (namn: "WWDC", stad: "San Jose") wwdc [keyPath: nameKeyPath] // "WWDC"De
nameKeyPath
objekt beskriver en hänvisning tillnamn
fast egendom. Den kan sedan användas som ett prenumeration på det objektet.Om du ändrar variabeln från
låta
tillvar
avWWDC
, Du kan också ändra en specifik egenskap via synkroniseringen med sökvägen.wwdc [keyPath: nameKeyPath] = "AltConf" låt namnet = wwdc [keyPath: nameKeyPath] // "AltConf"Ensidiga områden
SE-0172 föreslog att lägga till nya prefix- och postfixoperatörer för att undvika onödigt att upprepa ett start- eller slutindex när det kan utläsas. Om du till exempel vill prenumerera en matris från det andra indexet helt till den sista kan du skriva det på följande sätt:
låt siffror = [-2, -1, 0, 1, 2] låt positivt = antal [2 ...Tidigare, den
endIndex
måste specificeras Nu finns en kortare syntax:låt positivt = antal [2 ...]Eller om du vill börja med startindexet:
låt negativ = siffror [... 1]Samma syntax kan också användas för mönster matchning i en
växla
påstående.Generiska prenumerationer
Före Swift 4 krävdes abonnemang att definiera en specifik returvärdetyp. SE-0148 föreslog möjligheten att definiera en enda generisk prenumeration som skulle leda till returtypen baserat på det definierade resultatvärdet. Bortsett från typannotationen fungerar det ganska mycket på samma sätt som tidigare.
struct Konferenser låt konferenser: [String: Any] // Returnerar konferensmodellerna med sin nyckel. index(nyckel: String) -> T? returnera konferenser [nyckel] som? T // Ange variabelns returtyp och åtkomst till objektet via prenumeration. låt sak: konferens? = konferenser ["WWDC"] Som du kan se förbättras detta verkligen dina objekts läsbarhet i de fall där du behöver komma åt dem via subscriptsyntaxen.
Klass och Subtyp Existentials
En av de saknade funktionerna från Swift-typsystemet hittills har varit förmågan att begränsa en klass till ett specifikt protokoll. Detta har fastställts i Swift 4-du kan nu ange typen av ett objekt och de protokoll som det måste överensstämma med, tack vare SE-0156. Du kan till exempel skriva en metod som tar en
UIView
som överensstämmer meduppladdningsbart
protokoll med följande syntax:func reload (visa: UIView & Reloadable)Ordlista och Ange förbättringar
Ordbok
ochUppsättning
fick också en fin uppdatering i Swift 4. De är mycket trevligare att använda tack vare några verktygsmetoder som har lagts till.
mapValues
Dictionary har nu en
mapValues
Metod för att ändra alla värden, för att undvika användning av generiskaKarta
metod som kräver att man arbetar med nyckel, värde-tuples.låt konferenser = ["WWDC": "Mycket bra", "AltConf": "Bra", "Firebase Party": "Mycket kul"] // Kart över alla värden i ordboken. låt newConferences = conferences.mapValues värde i returvärde + "👍"
filtrera
Retur typDe
filtrera
Metoden returnerar nu ett objekt av samma typ som du filtrerar med.// Typen av denna variabel är [String: String] låt wwdc = conferences.filter $ 0.key == "WWDC"Standard för ordbokssökning
När du arbetar med ordböcker kan du ange ett standardvärde när du använder prenumerationssyntaxen för att undvika att du senare ska ta bort en valfri.
// Standardvärde om nyckel inte hittas. låt talkShow = konferenser ["Talk Show", standard: "🤷♂️"]Ordbok Gruppering Initializer
Slutligen a
Ordbok (gruppering :)
initialiseraren har införts för att underlätta att skapa en ny ordlista genom att gruppera elementen i en befintlig samling enligt vissa kriterier.I följande exempel skapar vi en ordlista genom att gruppera alla
konferenser
som har samma startbrev. Ordlistan kommer att ha en nyckel för varje startbrev ikonferenser
samling, med varje värde som består av alla nycklar som börjar med den bokstaven.låt ordbok = ordbok (gruppering: conferences.values) $ 0.uppercased (). först!Medel
Om du är intresserad av att gå djupare in i de nya Swift 4-funktionerna, här är några fler resurser:
- Vad är nytt i Swift - Session 402 - WWDC 2017
- Apple Swift Guide
- Ole Begemanns Vad är nytt i Swift 4 Playground
- Migrationsguide till Swift 4
Slutsats
Nu när du har tittat på några av de stora nya funktionerna i Swift 4 klarar du förmodligen lite för att börja använda dem, för att hålla din kodbas frisk och ren. Börja med att skriva din nya kod för att dra nytta av de användbara nya funktionerna och tänka på att refactoring några av din tidigare kod för att göra det enklare och lättare att läsa.
Lär dig Swift
Vi har byggt en komplett guide för att hjälpa dig att lära dig Swift, oavsett om du bara har börjat med grunderna eller vill utforska mer avancerade ämnen.
Du kan också kolla in några av våra andra inlägg i IOS App Development!