Kurzusok
/
Swift
Swift
/
Feladatok
/
A versklub első szabálya
A versklub első szabálya

A versklub első szabálya

Tanulófeladat

Bevezetés

Importálás

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.

Stringek indexelése

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.

Néhány hasznos metódus

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!"

Stringmetódusok

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.

Stringek felbontása a components(separatedBy:) metódussal

Ha 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!"]

Előtagok és utótagok ellenőrzése a hasPrefix(_:) és a hasSuffix(_:) metódussal

Ha 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

Kis- és nagybetűsség megváltoztatása

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!"

Részstringek cseréje a replacingOccurrences(of:with:) metódussal

Ha 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!"

Stringek összefűzése a joined(separator:) metódussal

A 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"

Utasítások

Ú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:

1. Bontsd fel a stringet külön sorokra

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"].

2. Bejárati ajtó

  1. Az őr felmond egy verset.
  2. A verset külön sorokra kell bontanod.
  3. Ki kell venned minden sor első betűjét.
    • Ha egy sor üres, helyette a _ jelet használd.
  4. A betűket össze kell illesztened, így egy szó áll össze belőlük.

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"

3. A hátsó ajtó

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.

  1. Az őr felmond egy verset.
  2. A verset sorokra kell bontanod.
  3. Ki kell venned minden sor utolsó betűjét.
    • A sor végén néha szóközök lehetnek, ezért ezeket le kell vágnod.
  4. A betűket össze kell illesztened, majd a belőlük álló szó végére be kell írnod a ", 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"

4. A titkos szoba

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.

  1. Az őr felmond egy verset.
  2. A verset sorokra kell bontanod.
  3. Ki kell venned az ith sor ith betűjét.
  4. A betűket össze kell illesztened, majd a belőlük álló szó végére be kell írnod a "!" jelet.
  5. A szót nagybetűs alakba kell hoznod.

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!"
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Swift Exercism

Készen állsz elkezdeni a(z) A versklub első szabálya feladatot?

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.