Треки
/
Swift
Swift
/
Вправи
/
Майстерня вивісок Кела
Майстерня вивісок Кела

Майстерня вивісок Кела

Навчальна вправа

Вступ

Рядок тексту (англ. string) представляє текстові дані. У Swift String - це впорядкована колекція значень Character, де кожен символ відповідає одному символу Unicode.

Створити рядок тексту можна за допомогою літерала рядка тексту, тобто послідовності символів, узятої в подвійні лапки ("). Для багаторядкових рядків тексту використовують потрійні лапки ("""):

let hello: String = "Hello, World!"

let poem: String = """
Roses are red,
Violets are blue.
Sugar is sweet,
And so are you.
"""

Рядки тексту у Swift безшовно поєднуються з класом NSString фреймворку Foundation, що відкриває доступ до широких можливостей обробки тексту.

Символи

Character представляє один розширений графемний кластер, тобто зрозумілий людині символ, що складається з одного або кількох скалярних значень Unicode. Скалярне значення Unicode - це 21-бітна кодова точка в діапазоні від U+0000 до U+D7FF включно або від U+E000 до U+10FFFF включно.

let aChar: Character = "A"

Виведення типу

Коли ми пишемо літерал рядка тексту, Swift автоматично виводить його тип як String. Щоб зберегти один символ як Character, потрібно явно вказати анотацію типу:

let aString = "A"        // Inferred as String
let aChar: Character = "A" // Explicitly typed as Character
print(type(of: aString)) // Prints String
print(type(of: aChar))   // Prints Character

// The following code will not compile:
let badChar: Character = "Too many characters"
// Error: Cannot convert value of type 'String' to specified type 'Character'

Конкатенація

Поєднувати рядки тексту можна за допомогою оператора додавання (+):

print("honey" + "comb")
// Prints "honeycomb"

Не можна безпосередньо конкатенувати Character з String за допомогою +, спершу не перетворивши символ на рядок тексту. Однак можна скористатися методом append(_:), щоб додати безпосередньо до змінюваного рядка тексту або рядок тексту, або символ:

var greeting = "Hello"
let world = ", world"
let period: Character = "."

greeting.append(world)
print(greeting) // Prints "Hello, world"

greeting.append(period)
print(greeting) // Prints "Hello, world."

Інтерполяція рядків тексту

Інтерполяція рядків тексту дає змогу побудувати рядок тексту, вбудовуючи константи, змінні, літерали та вирази всередину літералів рядка тексту. Кожен вираз беруть у дужки, перед якими стоїть зворотна скісна риска (\( ... )):

let radius = 5.0
let circle = "The area of a circle with radius \(radius) is \(Double.pi * radius * radius)"
print(circle) // Prints "The area of a circle with radius 5.0 is 78.53981633974483"

Властивості рядків тексту та символів

Рядки тексту й символи мають кілька властивостей, які дають змогу дізнатися про їхній вміст.

Властивості рядків тексту

Ось деякі з найпоширеніших властивостей рядків тексту:

Властивість Опис Приклад
isEmpty Повертає true, якщо рядок тексту не має символів "Hello".isEmpty evaluates to false
count Повертає кількість символів у рядку тексту "Hello".count evaluates to 5

Повний перелік властивостей дивіться в документації Apple про String.

Властивості символів

Ось деякі з найпоширеніших властивостей символів:

Властивість Опис Приклад
isLowercase Повертає true, якщо символ у нижньому регістрі "a".isLowercase evaluates to true
isUppercase Повертає true, якщо символ у верхньому регістрі "A".isUppercase evaluates to true
isNumber Повертає true, якщо символ є цифрою "1".isNumber evaluates to true
isWhitespace Повертає true, якщо символ є пробільним " ".isWhitespace evaluates to true

Повний перелік властивостей дивіться в документації Apple про Character.

Перетворення типів

Щоб перетворити інші типи на рядки тексту, можна скористатися ініціалізатором String(_:), який підтримує стандартні типи, як-от Int, Double і Character:

let charX: Character = "x"
print(String(charX))     // Prints "x"
print(String(110))       // Prints "110"
print(String(Double.pi)) // Prints "3.141592653589793"

Спеціальні символи

Літерали рядків тексту у Swift підтримують кілька керівних послідовностей для спеціальних символів:

Послідовність Опис
\0 Нульовий символ
\\ Зворотна скісна риска
\t Горизонтальна табуляція
\n Переведення рядка (новий рядок)
\r Повернення каретки
\' Знак одинарної лапки
\" Знак подвійної лапки
\u{n} Довільне скалярне значення Unicode (шістнадцяткове)
let quote: String = "\"Hello\", he said."
print(quote) // Prints "Hello", he said.

let unicode: Character = "\u{1F496}"
print(unicode) // Prints 💖

Вказівки

У цій вправі ми будемо писати код, який допоможе компанії з виготовлення вивісок створювати індивідуальні повідомлення для своїх вивісок.

1. Створімо набір корисних рядків тексту

Визначмо наведені нижче сталі рядки тексту (англ. string), які будемо використовувати для створення вивісок:

  • birthday: тут зберігається значення "Birthday"
  • valentine: тут зберігається значення "Valentine's Day"
  • anniversary: тут зберігається рядок тексту "Anniversary"

2. Створімо набір корисних символів

Визначмо наведені нижче сталі символи, які будемо використовувати для створення вивісок:

  • space: тут зберігається значення " " (один пробіл)
  • exclamation: тут зберігається значення "!"

3. Поєднаймо фрази, щоб побудувати повідомлення

Реалізуймо функцію buildSign(for:name:), яка приймає аргумент for зі значенням одного з трьох рядків тексту, визначених у першому завданні, та аргумент name — рядок тексту з іменем людини, для якої призначено вивіску. Для побудови повідомлення для вивіски скористаймося конкатенацією та памʼятаймо, що вже визначені константи слід використати повторно. Функція повинна повернути повідомлення для вивіски як рядок тексту.

buildSign(for: birthday, name: "Otto")
// returns "Happy Birthday Otto!"

buildSign(for: anniversary, name: "Valentina")
// returns "Happy Anniversary Valentina!"

4. Побудуймо вивіску на випуск

Реалізуймо функцію graduationFor(name:year:), яка приймає аргумент name — рядок тексту з іменем людини, для якої призначено вивіску, та аргумент year — ціле число із роком, у якому людина випускається. Для побудови повідомлення для вивіски скористаймося шаблонними рядками. Функція повинна повернути повідомлення для вивіски як рядок тексту.

graduationFor(name: "Padma", year: 2023)
// returns "Congratulations Padma!\nClass of 2023"

5. Обчислімо вартість вивіски

Реалізуймо функцію costOf(sign:), яка приймає аргумент sign — рядок тексту з повідомленням для вивіски. Базова ціна вивіски становить 20 у заданій валюті. Крім того, кожна літера коштує 2 (пробіли також враховуються в розрахунку). Функція повинна повернути вартість вивіски як ціле число.

costOf(sign: "Happy Birthday Grandma!")
// returns 66
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Swift Exercism

Час розпочати Майстерня вивісок Кела?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Swift, а також 35 концепцій116 вправ та справжнє наставництво від людей, і все це безкоштовно.