Урок 2.2 Строки

Текст есть везде. Вы найдете его на рекламных щитах, в социальных сетях, на счетах и на коробках с хлопьями. Поэтому неудивительно, что текст так же важен в программировании, как и везде в нашем мире.

В этом уроке вы узнаете, как создавать и сохранять текст, используя строковый тип String. Вы познакомитесь с различными строковыми методами, которые позволяют сравнивать две строки, получать доступ к определенным символам внутри строки, а также вставлять и удалять значения.


Что Вы Узнаете

  • Как объявить строку String
  • Как сравнить две строки
  • Как получить доступ к определенным символам в строке

Словарь


Связанные Ресурсы

Руководство по языку программирования Swift: Строки и символы

На предыдущем уроке вы напечатали каноническую строку “Hello, world!”. Вы создали “Hello, world!”, собрав воедино коллекцию символов. Строки Swift представлены типом String, и наиболее распространенным способом его определения является использование строкового литерала.

Строковый литерал - это необработанное представление строкового значения String. Вы пишете строковый литерал, заключая набор символов в двойные кавычки “.

Строковые литералы обычно используются для установки начального значения для константы или переменной:

 

let greeting = “Hello”
var otherGreeting = “Salutations”

 

Если вы присваиваете строку константе (используя let), строка является неизменяемой и не может быть изменена. Если строка назначена переменной (с использованием var), строка является изменяемой и может изменяться.

Если ваш строковый литерал должен состоять из нескольких строк, просто заключите свой набор символов в три двойные кавычки “””. В своей многострочной форме строковый литерал включает в себя все строки между его открывающими и закрывающими кавычками. Строка начинается в первой строке после открывающих кавычек и заканчивается на строке перед закрывающими кавычками.

 

let joke = “””
  Q: Why did the chicken cross the road?
  A: To get to the other side!
  “””
print(joke)


Console Output:
Q: Why did the chicken cross the road?
A: To get to the other side!

 

Любой пробел, предшествующий каждой строке в вашем многострочном строковом литерале, будет игнорироваться, если он совпадает с закрывающими кавычками """. Многострочные строковые литералы могут содержать двойные кавычки (").

let greeting = """
  It is traditional in programming to print "Hello, world!"
  """

Чтобы включить двойные кавычки в однострочные строковые литералы, вам нужно будет использовать обратную косую черту - бекслэш (\), известную в Swift как escape-символ. Это делается для того, чтобы вы “escape (избегали)” обычной интерпретации символов в строке.

let greeting = “It is traditional in programming to print
\”Hello, world!\””

Вы можете использовать escape-символ с другими буквами и символами для получения определенных результатов:

  • Двойная кавычка: \”
  • Одиночная цитата: \’
  • Обратная косая черта: \\
  • Табуляция: \t
  • Новая строка (переход к следующей строке — как при нажатии кнопки Return): \n

Вы будете часто замечать, что хотите начать с пустой строки, а затем добавлять в неё что-то с течением времени. Это означает, что вам нужно будет сделать её переменной. Используйте следующий синтаксис для инициализации строки без какого-либо текста:

 

var myString = “”

 

Если вам нужно проверить, является ли строка String Swift пустой, вы можете использовать логическое свойство isEmpty:

 

var myString = “”
 
if myString.isEmpty {
  print(”The string is empty”)
}

 

Как и следовало ожидать, отдельные символы имеют тип Character. Но поскольку строки гораздо чаще встречаются в программировании, чем отдельные символы, Swift всегда будет определять тип набора символов — или даже одного символа — как String, если вы не укажете иное в аннотации типа:

 

let a = “a” //’a’ is a String
let b: Character = “b” //’b’ is a Character

 

Конкатенация и интерполяция

Иногда вам нужно комбинировать строки. Оператор + предназначен не только для чисел; он также может складывать строки вместе. Вы можете использовать + для создания нового строкового значения из нескольких строковых значений. Это называется конкатенацией.

 

let string1 = “Hello”
let string2 = “, world!”
let myString = string1 + string2 // “Hello, world!”

 

Если существующая строка является переменной, вы можете использовать оператор +=, чтобы добавить к ней или изменить ее.

 

var myString = “Hello”
myString = myString + “, world!” // “Hello, world!”
myString += “ Hello!” // “Hello, world! Hello!”

 

По мере усложнения строк использование оператора + может усложнить обработку вашего кода. Например, в приведенном выше коде вы можете забыть добавить пробел перед “Hello!”

Swift предоставляет синтаксис, известный как интерполяция строк String, который упрощает включение констант, переменных, литералов и выражений. Интерполяция строк позволяет легко объединить множество значений в одну строковую константу или переменную.

Вы можете вставить исходное значение константы или переменной в строку String, поставив перед именем обратную косую черту \ и заключив имя в круглые скобки (). В приведенном ниже примере печатная строка String будет содержать необработанные значения констант name и age.

 

let name = “Rick”
let age = 30
print(”\(name) is \(age) years old”) // Rick is 30 years old

 

Вы можете поместить целые выражения в круглые скобки. Эти выражения всегда будут сначала вычисляться, прежде чем быть напечатанными или сохраненными.

 

let a = 4
let b = 5
print(”If a is \(a) and b is \(b), then a + b equals \(a+b)”)


Console Output:
If a is 4 and b is 5, then a + b equals 9

 

Используя интерполяцию строк, необработанные значения констант a и b вставляются в печатное строковое значение.

На это намекали выше, но поскольку результатом строковой интерполяции является строка, вы также можете использовать ее везде, где вы бы использовали строку или строковый литерал:

 

let listName = "Shopping"
var items = 14
myLabel.text = "There are \(items) items on your \(listName) list"
// The label displays "There are 14 items on your Shopping list"
 
func setLabel(_ label: UILabel, to text: String) {
  label.text = text
}
 
setLabel(myLabel, to: "There are \(items) items on your
   \(listName) list")

 

Равенство строк и сравнение

Разработчикам часто приходится сравнивать строковые значения, чтобы убедиться, что они равны друг другу.

Так же, как вы делаете с числами, вы можете проверить равенство между двумя строками с помощью оператора ==. Как и следовало ожидать, == проверяет наличие идентичных символов в том же порядке. Поскольку символы верхнего регистра не идентичны их строчным аналогам, строки имеют одинаковое значение, если регистр каждого символа также совпадает. Это называется чувствительностью к регистру (case sensitivity).

 

let month = “January”
let otherMonth = “January”
let lowercaseMonth = “january”
if month == otherMonth {
  print(”They are the same”)
}
 
if month != lowercaseMonth {
  print(”They are not the same.”)
}


Console Output:
They are the same.
They are not the same.

 

Но, возможно, вы хотите игнорировать заглавные буквы строки при проверке равенства строк. Вы можете использовать метод lowercased() для нормализации этих двух значений, сравнивая полностью строчную версию строки с полностью строчной версией вызывающей строки.

 

let name = “Johnny Appleseed”
if name.lowercased() == “joHnnY aPPleseeD”.lowercased() {
  print(”The two names are equal.”)
}


Console Output:
The two names are equal.

 

Вы могли бы также использовать аналог lowercased(), uppercased(), который создает полностью прописную версию строки.
Если вы хотите сопоставить начало или конец строки, вы можете использовать метод hasPrefix(_:) или hasSuffix(_:). Так же, как и ==, эти совпадения чувствительны к регистру.

 

let greeting = “Hello, world!”
print(greeting.hasPrefix(”Hello”))
print(greeting.hasSuffix(”world!”))
print(greeting.hasSuffix(”World!”))


Console Output:
true
true
false

 

Может быть, вы хотите проверить, находится ли одна строка где-то внутри другой строки. Вы можете использовать метод contains(_:) для возврата логического значения, указывающего, была ли найдена подстрока или нет.

 

let greeting = “Hi Rick, my name is Amy.”
if greeting.contains(”my name is”) {
  print(”Making an introduction”)
}

 

Поскольку строка представляет собой набор символов, ее длина равна общему количеству символов. Размер любой коллекции можно определить с помощью ее свойства count. Вы можете использовать это свойство для сравнения строк или для оценки того, соответствуют ли строки определенному требованию.

 

let name = “Ryan Mears”
let count = name.count // 10
 
let newPassword = “1234”
 
if newPassword.count < 8 {
    print(”This password is too short. Passwords should have at
    least eight characters.”)
}


Console Output:
This password is too short. Passwords should have at least
eight characters.

 

В последнем блоке вы узнали, что вы можете использовать операторы switch для выполнения определенных блоков кода в зависимости от конкретного случая. Вы также можете использовать оператор switch для сопоставления с шаблоном нескольких значений строк или символов и соответствующего ответа.

 

let someCharacter: Character = “e”
switch someCharacter {
  case “a”, “e”, “i”, “o”, “u”:
    print(”\(someCharacter) is a vowel.”)
  default:
    print(”\(someCharacter) is not a vowel.”)
}


Console Output:
e is a vowel.

 

Более продвинутые темы для строк

Подобно методам lowercased(), hasPrefix(_:), hasSuffix(_:) и contains(_:), упомянутым ранее, строки имеют множество свойств и методов, которые могут быть полезны для отслеживания расположения символов внутри строк, создания новых строк из “substrings”, вставки символов или строки в существующие строки и многое другое. Большая часть этой функциональности является общей для всех коллекций Swift. На данный момент вам не нужно беспокоиться об этих более сложных строковых разделах, но имейте в виду, что вы всегда можете обратиться к документации, чтобы узнать больше, если захотите выполнить более сложные манипуляции со строками с помощью Swift. Для справки, вот несколько полезных строковых свойств и методов, которые вы могли бы посмотреть:

  • startIndex
  • endIndex
  • index(before:)
  • index(after:)
  • index(_:offsetBy:)
  • insert(_:at:)
  • insert(contentsOf:at:)
  • remove(at:)
  • removeSubrange(_:)
  • replaceSubrange(_:with:)

Для получения полного списка методов и дополнительной информации вы можете ознакомиться с документацией по строкам

 

Юникод

Каждая строка Swift соответствует международному вычислительному стандарту, называемому Unicode. Соответствие Юникоду позволяет Swift выходить за рамки короткого списка букв и символов в английском языке. Вместо этого Юникод включает в себя более 128 000 различных символов, используемых на нескольких языках. Это включает в себя акценты на символах (é), эмодзи (🐮), символах (∞), кандзи (七) и других специализированных символах. Кроме того, Unicode поддерживает текст, который читается справа налево, а также слева направо.
Swift гарантирует, что вы можете удобно работать с символами Юникода, так что “e”, “é” и “ 🐮 ” обрабатываются как отдельные символы длиной 1.

 

let cow = "🐮"
let credentials = "résumé"
print("∞".count) // 1

 

На самом деле символ представляет собой “расширенный кластер графем Юникода”, который представляет собой причудливый способ сказать, что некоторые символы на самом деле состоят из нескольких (часто невидимых) символов, хотя они кажутся пользователю одним символом. Например, “ü” состоит из двух символов, а “👩🏽‍🎓” состоит из четырех символов! Swift значительно упрощает работу с ними. 

Лабораторная работа

Откройте и выполните упражнения в Lab—Strings.playground.

Подключение к дизайну

В рабочей тетради по дизайну приложения подумайте о том, где текст может появиться в вашем приложении. Какие сообщения могут отображаться пользователю? Будут ли в интерфейсе необходимы инструкции или другой текст? Оставьте комментарии в разделе Карты или добавьте пустой слайд в конце документа.

В примере приложения workbook Go Green пользователь может выбирать типы мусора и отходов, которые он использует в течение дня. Каждый из этих типов материалов, таких как бумага или кофейная гуща, будет строками, сохраняемыми приложением. Заголовок, который пользователь вводит для переработанного элемента, также является строкой.

 

 


Отрывок из книги
Develop in Swift Fundamentals
Apple Education
https://books.apple.com/ru/book/develop-in-swift-fundamentals/id1581182804

Information

Apple, the Apple logo, Apple Books, Apple TV, Apple Watch, Cocoa, Cocoa Touch, Finder, Handoff, HealthKit, iPad, iPad Pro, iPhone, iPod touch, Keynote, Mac, macOS, Numbers, Objective-C, Pages, Photo Booth, Safari, Siri, Spotlight, Swift, tvOS, watchOS, and Xcode are trademarks of Apple Inc., registered in the U.S. and other countries. App Store and iBooks Store are service marks of Apple Inc., registered in the U.S. and other countries. ​
The Bluetooth® word mark and logos are registered trademarks owned by Bluetooth SIG, Inc. and any use of such marks by Apple is under license. ​
IOS is a trademark or registered trademark of Cisco in the U.S. and other countries and is used under license. ​
Other product and company names mentioned herein may be trademarks of their respective companies.