Bár a Swift rengeteg funkciót kínál a szabványos könyvtárában, külső könyvtárak és keretrendszerek importálásával számos további funkcióhoz férhetsz hozzá. Ezek a modulok származhatnak közvetlenül a Swift-projektből (például a Swift Argument Parser), érkezhetnek Apple platform-keretrendszerekből (például a Foundation és a Network Framework), vagy származhatnak külső felek nyílt forráskódú könyvtáraiból (például a SwiftyBeaver).
Az olyan központi modulok, mint a Foundation (amely valószínűleg a leggyakrabban használt könyvtárak egyike a Swiftben), a Swift eszközláncával együtt érkeznek. A harmadik féltől származó könyvtárakat előbb hozzá kell adnod a projekt konfigurációjához (például a Swift Package Managerrel), mielőtt importálhatnád őket.
A modulok importálása úgy történik, hogy leírod az import kulcsszót, majd utána a modul nevét. A Foundationt például így importálhatod a programodba:
import Foundation
Egy modul importálásával annak típusai, metódusai és függvényei elérhetővé válnak a kódod számára.
A Foundation importálása például hasznos segédmetódusokkal bővíti a String típust, például a components(separatedBy:) metódussal is.
Konvenció szerint az import utasítások egy Swift-fájl elején helyezkednek el, hogy a függőségek azonnal láthatók legyenek mindenki számára, aki olvassa a kódot.
Egy String egyes karaktereit ugyanúgy érheted el indexeléssel, mint egy tömb elemeit.
A stringekhez használt indexek azonban nem egész számok, és nem lehet velük közvetlenül dolgozni.
Ehelyett egy másik ismert index alapján kell kiszámítanod őket, például a startIndex segítségével, amely egy nem üres string első karakterének pozíciójára mutat; ezt a String és az NSString könyvtárban elérhető metódusokkal teheted meg (amikor a Foundation modul importálva van, a Swiftben a stringek hozzáférnek az NSString összes tulajdonságához és metódusához).
Vegyük például a következő stringet:
let csv = "apple,pear,peach,orange,cherry,lime,goosberry"
Nem írhatod azt, hogy csv[21], hogy megkapd az „orange” „g” betűjét, hanem ki kell számítanod egy String.Index típusú értéket, és azt kell megadnod indexként.
Jegyezd meg, hogy ezeket az indexeket önmagukban nem arra szánták, hogy az ember megértse őket.
Ők az úgynevezett átlátszatlan indexek, mivel az embernek nem kell tudnia, mi van bennük.
let index = csv.index(csv.startIndex, offsetBy: 21)
csv[index]
// "g"
print(index)
// prints Index(_rawBits: 1376513)
Jegyezd meg azonban, hogy ha az eltolás nem érvényes index, azaz ha a startIndex előtti vagy az endIndex utáni indexet adná vissza, a művelet hibát vált ki, és összeomlik tőle a program.
Ennek a problémának a megelőzésére megadhatsz egy korlátozó indexet.
Ez egy opcionális indexet ad vissza, és egyébként érvénytelen indexek esetén nil-t ad vissza.
let tooFar = csv.index(csv.startIndex, offsetBy: 200)
// error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
let tooFarButSafe = csv.index(csv.startIndex, offsetBy: 200, limitedBy: csv.endIndex)
// nil
Ráadásul az indexek nem oszthatók meg a stringek között.
Például ha a fent kiszámított „orange” „g” betűjének index-ét használod arra, hogy a fam = "This is my family: 👨👩👦👦, this is our dog: 🐶, this is our cat: 🐱!" stringbe indexelj, azaz fam[index], az összeomlasztja a programodat.
Sok oka van mindennek, de ezek alapvetően mind arra vezethetők vissza, hogy „a Unicode trükkös”.
Általánosságban, ha az egyes karakterekhez véletlenszerű hozzáférésre van szükséged, valószínűleg más adatszerkezetet érdemes használnod, például az Array<Character>-t.
A Swiftben a first és a last metódussal kaphatod meg egy string első és utolsó karakterét.
Ezek a metódusok opcionális karaktert adnak vissza, tehát ha a string üres, nil-t adnak vissza.
let str = "Hello, world!"
print(str.first) // Prints Optional("H")
print(str.last) // Prints Optional("!")
A prefix és a suffix metódussal egy string egy részstringjét is megkaphatod.
Ezek a metódusok egy egész számot vesznek argumentumként, és egy olyan részstringet adnak vissza, amely a string első vagy utolsó n karakterét tartalmazza.
let str = "Hello, world!"
print(str.prefix(5)) // Prints "Hello"
print(str.suffix(6)) // Prints "world!"
A szövegekkel való munka gyakori feladat a programozásban. A Swift a Foundation keretrendszerrel együtt sok kényelmes metódust és tulajdonságot kínál a stringek vizsgálatához, átalakításához és kezeléséhez.
components(separatedBy:) metódussalHa egy stringet egy elválasztó mentén részstringek tömbjére szeretnél bontani, használd a components(separatedBy:) metódust (ehhez importálnod kell a Foundationt):
import Foundation
let sentence = "Hello, world!"
let words = sentence.components(separatedBy: " ")
print(words) // Prints ["Hello,", "world!"]
hasPrefix(_:) és a hasSuffix(_:) metódussalHa ellenőrizni szeretnéd, hogy egy string egy adott karaktersorozattal kezdődik-e vagy végződik-e, használd a hasPrefix(_:) és a hasSuffix(_:) metódust:
let greeting = "Hello, world!"
print(greeting.hasPrefix("Hello")) // Prints true
print(greeting.hasSuffix("world!")) // Prints true
Ezekkel a szabványos metódusokkal és tulajdonságokkal átalakíthatod egy string kis- és nagybetűsségét:
lowercased(): A string kisbetűs másolatát adja vissza.uppercased(): A string nagybetűs másolatát adja vissza.capitalized: Egy másolatot ad vissza, amelyben minden szó első betűje nagybetűs (a Foundationből).let greeting = "hello, world!"
print(greeting.lowercased()) // Prints "hello, world!"
print(greeting.uppercased()) // Prints "HELLO, WORLD!"
print(greeting.capitalized) // Prints "Hello, World!"
replacingOccurrences(of:with:) metódussalHa egy cél-részstring minden előfordulását le szeretnéd cserélni egy másik stringre, használd a replacingOccurrences(of:with:) metódust (a Foundationből):
let greeting = "Hello, world!"
let updated = greeting.replacingOccurrences(of: "world", with: "Swift")
print(updated) // Prints "Hello, Swift!"
joined(separator:) metódussalA joined(separator:) metódus a stringek gyűjteményeihez tartozik, például a [String]-hez.
Egy elválasztóval fűzi össze az elemeket egyetlen stringgé:
let words = ["Hello", "world"]
let sentence = words.joined(separator: ", ")
print(sentence) // Prints "Hello, world"
Új költészeti klub nyílt a városban, és épp azon gondolkodsz, hogy benézz oda. Mivel korábban már történtek incidensek, a klubnak nagyon sajátos ajtószabályzata van, amelyet el kell sajátítanod, mielőtt a belépést megkísérled.
A költészeti klubban két ajtó van, és mindkettőt őr vigyázza. Ahhoz, hogy bejuss, ki kell derítened az aznapi jelszót:
Először is a verset külön sorokra kell bontanod. Az őr felmond egy verset, neked pedig sorokra kell bontanod.
Valósítsd meg a splitOnNewlines függvényt, amely egy stringet kap, és a sortörés karaktert elválasztóként használva stringek tömbjére bontja azt.
A függvény egy stringtömböt adjon vissza, amelyben minden string a vers egy-egy sora.
splitOnNewlines("Hello.\nHow are you?\n\nI'm doing fine.")
// returns ["Hello." ,"How are you?", "", "I'm doing fine"].
_ jelet használd.Például egyik kedvenc írójuk Michael Lockwood, akitől az alábbi akrosztichon vers származik; az akrosztichon azt jelenti, hogy minden mondat első betűje egy szót ad ki:
Stands so high
Huge hooves too
Impatiently waits for
Reins and harness
Eager to leave
Amikor az őr felmondja a verset, külön sorokra bontod, és minden sor első betűjével válaszolsz, azaz ["S", "H", "I", "R", "E"].
Ezután az őr megadja neked azt a szót, amelyet a válaszul adott betűk tömbje alkot, hogy nagy kezdőbetűs alakba hozd.
Végül a visszaadott jelszó "SHIRE", és bejutsz.
Valósítsd meg a frontDoorPassword függvényt, amely egy stringet kap, ami a verset képviseli.
A függvény adja vissza azt a jelszót, amelyet az őrnek megadnál.
frontDoorPassword("Stands so high\nHuge hooves too\nImpatiently waits for\nReins and harness\nEager to leave")
// returns "SHIRE"
A klub hátsó részében találod a leghíresebb költőket, ez a VIP-részleghez hasonlít. Mivel ez nem mindenkinek jár, a hátsó ajtó procedúrája kicsit bonyolultabb.
", please" szöveget.Például a korábban említett vers egyben telestichon is, ami azt jelenti, hogy minden mondat utolsó betűje egy szót ad ki:
Stands so high
Huge hooves too
Impatiently waits for
Reins and harness
Eager to leave
Amikor az őr felmondja a verset, külön sorokra bontod, levágod a sorok végéről a szóközöket, és minden sor első betűjével válaszolsz, azaz ["h", "o", "r", "s", "e"].
Ezután az őr megadja neked azt a szót, amelyet a válaszul adott betűk tömbje alkot, hogy nagy kezdőbetűs alakba hozd, és a végére fűzd a ", please" szöveget.
Végül a visszaadott jelszó "horse, please", és bejutsz.
Valósítsd meg a backDoorPassword függvényt, amely egy stringet kap, ami a verset képviseli.
A függvény adja vissza azt a jelszót, amelyet az őrnek megadnál.
backDoorPassword("Stands so high\nHuge hooves too\nImpatiently waits for\nReins and harness\nEager to leave")
// returns "horse, please"
A klub hátsó termében van még egy ajtó, amely a titkos szobába vezet, ahová csak a legkiválóbb költők léphetnek be.
"!" jelet.Például a korábban említett vers egy módosított változata illik erre a mintára:
Stands so high
Huge hooves too
Impatiently waits for
Rider with harness
Eager to leave
Amikor az őr felmondja a verset, külön sorokra bontod, levágod a sorok végéről a szóközöket, és minden sor ith betűjével válaszolsz, azaz ["S", "u", "p", "e", "r"].
Ezután az őr megadja neked azt a szót, amelyet a válaszul adott betűk tömbje alkot, hogy nagybetűs alakba hozd, és a végére fűzd a "!" jelet.
Végül a visszaadott jelszó SUPER!, és bejutsz.
Valósítsd meg a secretRoomPassword függvényt, amely egy stringet kap, ami a verset képviseli.
A függvény adja vissza azt a jelszót, amelyet az őrnek megadnál.
secretRoomPassword("Stands so high\nHuge hooves too\nImpatiently waits for\nRider with harness\nEager to leave")
// returns "SUPER!"
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Swift nyelvet 35 fogalom116 feladat segítségével, valódi emberi mentorálással, mindez ingyen.