Поиск…


Синтаксис

  • String.characters // Возвращает массив символов в строке
  • String.characters.count // Возвращает количество символов
  • String.utf8 // A String.UTF8View возвращает символы символа UTF-8 в строке
  • String.utf16 // A String.UTF16View возвращает символы символа UTF-16 в строке
  • String.unicodeScalars // String.UnicodeScalarView возвращает символы символа UTF-32 в строке
  • String.isEmpty // Возвращает true, если строка не содержит текста
  • String.hasPrefix (String) // Возвращает true, если строка имеет префикс с аргументом
  • String.hasSuffix (String) // Возвращает true, если String суффикс с аргументом
  • String.startIndex // Возвращает индекс, соответствующий первому символу в строке
  • String.endIndex // Возвращает индекс, соответствующий пятну после последнего символа в строке
  • String.components (separateBy: String) // Возвращает массив, содержащий подстроки, разделенные данной разделительной строкой
  • String.append (Character) // Добавляет символ (заданный как аргумент) в String

замечания

String в Swift - это набор символов, а также набор скаляров Unicode. Поскольку Swift Strings основаны на Unicode, они могут быть любым сканируемым значением Unicode, включая языки, отличные от английского, и emojis.

Поскольку два скаляра могут объединяться для формирования одного символа, количество скаляров в String не обязательно всегда совпадает с количеством символов.

Дополнительные сведения о строках см. В разделе Быстрый язык программирования и ссылка на String Structure .

Сведения о реализации см. В разделе «Swift String Design»

Строковые и символьные литералы

Строковые литералы в Swift ограничены двойными кавычками ( " ):

let greeting = "Hello!"  // greeting's type is String

Символы могут быть инициализированы из строковых литералов, пока литерал содержит только один кластер графем:

let chr: Character = "H" // valid
let chr2: Character = "😊" // valid
let chr3: Character = "abc" // invalid - multiple grapheme clusters

Интерполяция строк

Строковая интерполяция позволяет вводить выражение непосредственно в строковый литерал. Это можно сделать со всеми типами значений, включая строки, целые числа, числа с плавающей запятой и многое другое.

Синтаксис - это обратная косая черта, за которой следуют скобки, обертывающие значение: \(value) . Любое допустимое выражение может появляться в круглых скобках, включая вызовы функций.

let number = 5
let interpolatedNumber = "\(number)"  // string is "5"
let fortyTwo = "\(6 * 7)"             // string is "42"

let example = "This post has \(number) view\(number == 1 ? "" : "s")"
// It will output "This post has 5 views" for the above example.
// If the variable number had the value 1, it would output "This post has 1 view" instead.

Для пользовательских типов поведение по умолчанию для интерполяции строк заключается в том, что "\(myobj)" эквивалентно String(myobj) , тому же представлению, используемому print(myobj) . Вы можете настроить это поведение, CustomStringConvertible протокол CustomStringConvertible для своего типа.

3.0

Для Swift 3, в соответствии с SE-0089 , String.init<T>(_:) был переименован в String.init<T>(describing:) .

Интерполяция строк "\(myobj)" предпочтет новый String.init<T: LosslessStringConvertible>(_:) , но вернется к init<T>(describing:) если значение не LosslessStringConvertible .

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

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

символ Имея в виду
\0 нулевой символ
\\ простой обратный слэш, \
\t символ табуляции
\v вертикальная вкладка
\r возвращение каретки
\n строка («новая строка »)
\" двойная кавычка "
\' одна цитата, '
\u{n} кодовая точка Unicode n (в шестнадцатеричной форме)

Пример:

let message = "Then he said, \"I \u{1F496} you!\""

print(message) // Then he said, "I 💖 you!"

Конкатенатные строки

Объединить строки с оператором + для создания новой строки:

let name = "John"
let surname = "Appleseed"
let fullName = name + " " + surname  // fullName is "John Appleseed"

Добавляем к изменяемой строке, используя оператор присваивания += или используя метод:

let str2 = "there"
var instruction = "look over"
instruction += " " + str2  // instruction is now "look over there"

var instruction = "look over"
instruction.append(" " + str2)  // instruction is now "look over there"

Добавить один символ в изменяемую строку:

var greeting: String = "Hello"
let exclamationMark: Character = "!"
greeting.append(exclamationMark) 
// produces a modified String (greeting) = "Hello!"

Добавить несколько символов в изменяемую строку

var alphabet:String = "my ABCs: "
alphabet.append(contentsOf: (0x61...0x7A).map(UnicodeScalar.init)
                                         .map(Character.init) )
// produces a modified string (alphabet) = "my ABCs: abcdefghijklmnopqrstuvwxyz"
3.0

appendContentsOf(_:) был переименован в append(_:) .

Присоедините последовательность строк, чтобы сформировать новую строку, используя joinWithSeparator(_:) :

let words = ["apple", "orange", "banana"]
let str = words.joinWithSeparator(" & ")

print(str)   // "apple & orange & banana"
3.0

joinWithSeparator(_:) был переименован в joinWithSeparator(_:) joined(separator:) .

По умолчанию separator является пустая строка, поэтому ["a", "b", "c"].joined() == "abc" .

Изучить и сравнить строки

Проверьте, нет ли строки:

if str.isEmpty {
    // do something if the string is empty
}

// If the string is empty, replace it with a fallback:
let result = str.isEmpty ? "fallback string" : str

Проверьте, равны ли две строки (в смысле канонической эквивалентности Unicode ):

"abc" == "def"          // false
"abc" == "ABC"          // false
"abc" == "abc"          // true

// "LATIN SMALL LETTER A WITH ACUTE" == "LATIN SMALL LETTER A" + "COMBINING ACUTE ACCENT"
"\u{e1}" == "a\u{301}"  // true

Убедитесь, что строка начинается / заканчивается другой строкой:

"fortitude".hasPrefix("fort")      // true
"Swift Language".hasSuffix("age")  // true

Кодирование строк и их разложение

Строка Swift состоит из кодовых точек Unicode . Его можно разложить и закодировать несколькими способами.

let str = "ที่👌①!"

Разделение строк

Строка , в characters являются Unicode расширенной графемы кластеры :

Array(str.characters)  // ["ที่", "👌", "①", "!"]

unicodeScalars - это коды кода Unicode, которые составляют строку (обратите внимание, что ที่ является одним кластером графем, но 3 кодовых пункта - 3607, 3637, 3656), поэтому длина результирующего массива не совпадает с длиной characters ):

str.unicodeScalars.map{ $0.value }  // [3607, 3637, 3656, 128076, 9312, 33]

Вы можете кодировать и разлагать строки как UTF-8 (последовательность UInt8 s) или UTF-16 (последовательность UInt16 s):

Array(str.utf8)   // [224, 184, 151, 224, 184, 181, 224, 185, 136, 240, 159, 145, 140, 226, 145, 160, 33]
Array(str.utf16)  // [3607, 3637, 3656, 55357, 56396, 9312, 33]

Длина строки и итерация

characters строки, unicodeScalars , utf8 и utf16 - это все коллекции s, поэтому вы можете получить их count и перебрать их:

// NOTE: These operations are NOT necessarily fast/cheap! 

str.characters.count     // 4
str.unicodeScalars.count // 6
str.utf8.count           // 17
str.utf16.count          // 7
for c in str.characters { // ...
for u in str.unicodeScalars { // ...
for byte in str.utf8 { // ...
for byte in str.utf16 { // ...

Unicode

Установка значений

Использование Unicode напрямую

var str: String = "I want to visit 北京, Москва, मुंबई, القاهرة, and 서울시. 😊"
var character: Character = "🌍"

Использование шестнадцатеричных значений

var str: String = "\u{61}\u{5927}\u{1F34E}\u{3C0}" // a大🍎π
var character: Character = "\u{65}\u{301}" // é = "e" + accent mark

Обратите внимание, что Swift Character может состоять из нескольких кодовых точек Unicode, но представляется одиночным символом. Это называется расширенным кластером графем.

Конверсии

String -> Hex

// Accesses views of different Unicode encodings of `str`
str.utf8
str.utf16
str.unicodeScalars // UTF-32

Hex -> String

let value0: UInt8 = 0x61
let value1: UInt16 = 0x5927
let value2: UInt32 = 0x1F34E

let string0 = String(UnicodeScalar(value0)) // a
let string1 = String(UnicodeScalar(value1)) // 大
let string2 = String(UnicodeScalar(value2)) // 🍎

// convert hex array to String
let myHexArray = [0x43, 0x61, 0x74, 0x203C, 0x1F431] // an Int array
var myString = ""
for hexValue in myHexArray {
    myString.append(UnicodeScalar(hexValue))
}
print(myString) // Cat‼🐱

Обратите внимание, что для UTF-8 и UTF-16 преобразование не всегда легко, потому что такие вещи, как emoji, не могут быть закодированы с одним значением UTF-16. Требуется суррогатная пара.

Реверсивные струны

2,2
let aString = "This is a test string."

// first, reverse the String's characters 
let reversedCharacters = aString.characters.reverse()

// then convert back to a String with the String() initializer
let reversedString = String(reversedCharacters)

print(reversedString) // ".gnirts tset a si sihT"
3.0
let reversedCharacters = aString.characters.reversed()
let reversedString = String(reversedCharacters)

Строки верхнего и нижнего регистров

Чтобы сделать все символы в строковом или нижнем регистре:

2,2
let text = "AaBbCc"
let uppercase = text.uppercaseString // "AABBCC"
let lowercase = text.lowercaseString // "aabbcc"
3.0
let text = "AaBbCc"
let uppercase = text.uppercased() // "AABBCC"
let lowercase = text.lowercased() // "aabbcc"

Проверьте, содержит ли String символы из заданного набора

Буквы

3.0
let letters = CharacterSet.letters

let phrase = "Test case"
let range = phrase.rangeOfCharacter(from: letters)

// range will be nil if no letters is found
if let test = range {
   print("letters found")
}
else {
   print("letters not found")
}
2,2
let letters = NSCharacterSet.letterCharacterSet()

let phrase = "Test case"
let range = phrase.rangeOfCharacterFromSet(letters)

// range will be nil if no letters is found
if let test = range {
   print("letters found")
}
else {
  print("letters not found")
}

Новая структура CharacterSet которая также соединяется с классом Objective-C NSCharacterSet определяет несколько предопределенных множеств:

  • decimalDigits
  • capitalizedLetters
  • alphanumerics
  • controlCharacters
  • illegalCharacters
  • и больше вы можете найти в ссылке NSCharacterSet .

Вы также можете определить свой собственный набор символов:

3.0
let phrase = "Test case"
let charset = CharacterSet(charactersIn: "t")

if let _ = phrase.rangeOfCharacter(from: charset, options: .caseInsensitive) {
   print("yes") 
}
else {
   print("no")
}
2,2
let charset = NSCharacterSet(charactersInString: "t")

if let _ = phrase.rangeOfCharacterFromSet(charset, options: .CaseInsensitiveSearch, range: nil) {
   print("yes")
}
else {
    print("no")
}

Вы также можете включить диапазон:

3.0
let phrase = "Test case"
let charset = CharacterSet(charactersIn: "t")

if let _ = phrase.rangeOfCharacter(from: charset, options: .caseInsensitive, range: phrase.startIndex..<phrase.endIndex)) {
   print("yes") 
}
else {
   print("no")
}

Количество вхождений символа в строку

Учитывая String и Character

let text = "Hello World"
let char: Character = "o"

Мы можем подсчитать количество раз, когда Character появляется в String используя

let sensitiveCount = text.characters.filter { $0 == char }.count // case-sensitive
let insensitiveCount = text.lowercaseString.characters.filter { $0 == Character(String(char).lowercaseString) } // case-insensitive

Удалить символы из строки, не определенной в Set

2,2
func removeCharactersNotInSetFromText(text: String, set: Set<Character>) -> String {
   return String(text.characters.filter { set.contains( $0) })
}

let text = "Swift 3.0 Come Out"
var chars = Set([Character]("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ".characters))
let newText = removeCharactersNotInSetFromText(text, set: chars) // "SwiftComeOut"
3.0
func removeCharactersNotInSetFromText(text: String, set: Set<Character>) -> String {
  return String(text.characters.filter { set.contains( $0) })
}

let text = "Swift 3.0 Come Out"
var chars = Set([Character]("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ".characters))
let newText = removeCharactersNotInSetFromText(text: text, set: chars)

Форматирование строк

Ведущие нули

let number: Int = 7
let str1 = String(format: "%03d", number) // 007
let str2 = String(format: "%05d", number) // 00007

Числа после десятичного разряда

let number: Float = 3.14159
let str1 = String(format: "%.2f", number) // 3.14
let str2 = String(format: "%.4f", number) // 3.1416 (rounded)

Десятичное число до шестнадцатеричного

let number: Int = 13627
let str1 = String(format: "%2X", number) // 353B
let str2 = String(format: "%2x", number) // 353b (notice the lowercase b)

В качестве альтернативы можно использовать специализированный инициализатор, который делает то же самое:

let number: Int = 13627
let str1 = String(number, radix: 16, uppercase: true) //353B
let str2 = String(number, radix: 16) // 353b

Десятичное число с произвольным числом оснований

let number: Int = 13627
let str1 = String(number, radix: 36) // aij

Radix - Int в [2, 36] .

Преобразование строки Swift в числовой тип

Int("123") // Returns 123 of Int type
Int("abcd") // Returns nil
Int("10") // Returns 10 of Int type
Int("10", radix: 2) // Returns 2 of Int type
Double("1.5") // Returns 1.5 of Double type
Double("abcd") // Returns nil

Обратите внимание, что при выполнении этого возвращается Optional значение, которое должно быть разворачиваться соответствующим образом перед использованием.

Итерация строк

3.0
let string = "My fantastic string"
var index = string.startIndex

while index != string.endIndex {
    print(string[index])
    index = index.successor()
}

Примечание: endIndex после конца строки (т.е. string[string.endIndex] является ошибкой, но string[string.startIndex] в порядке). Кроме того, в пустой строке ( "" ) string.startIndex == string.endIndex true . Не забудьте проверить пустые строки, так как вы не можете вызвать startIndex.successor() в пустой строке.

3.0

В Swift 3 индексы String больше не имеют successor() , predecessor() , advancedBy(_:) , advancedBy(_:limit:) или distanceTo(_:) .

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

Доступными методами являются .index(after:) , .index(before:) и .index(_:, offsetBy:) .

let string = "My fantastic string"
var currentIndex = string.startIndex

while currentIndex != string.endIndex {
    print(string[currentIndex])
    currentIndex = string.index(after: currentIndex)
}

Примечание. Мы используем currentIndex в качестве имени переменной, чтобы избежать путаницы с методом .index .

И, например, если вы хотите пойти другим путем:

3.0
var index:String.Index? = string.endIndex.predecessor()

while index != nil {
    print(string[index!])
    if index != string.startIndex {
        index = index.predecessor()
    }
    else {
        index = nil
    }
}

(Или вы можете просто перенести строку сначала, но если вам не нужно проходить весь путь через строку, вы, вероятно, предпочли бы такой метод)

3.0
var currentIndex: String.Index? = string.index(before: string.endIndex)

while currentIndex != nil {
    print(string[currentIndex!])
    if currentIndex != string.startIndex {
        currentIndex = string.index(before: currentIndex!)
    }
    else {
        currentIndex = nil
    }
}

Примечание. Index - это тип объекта, а не Int . Вы не можете получить доступ к символу строки следующим образом:

let string = "My string"
string[2] // can't do this
string.characters[2] // and also can't do this

Но вы можете получить конкретный индекс следующим образом:

3.0
index = string.startIndex.advanceBy(2)
3.0
currentIndex = string.index(string.startIndex, offsetBy: 2)

И может вернуться назад следующим образом:

3.0
index = string.endIndex.advancedBy(-2)
3.0
currentIndex = string.index(string.endIndex, offsetBy: -2)

Если вы можете превысить границы строки или хотите указать лимит, вы можете использовать:

3.0
index = string.startIndex.advanceBy(20, limit: string.endIndex)
3.0
currentIndex = string.index(string.startIndex, offsetBy: 20, limitedBy: string.endIndex)

В качестве альтернативы можно просто перебирать символы в строке, но это может быть менее полезно в зависимости от контекста:

for c in string.characters {
    print(c)
}

Удалить ведущие и задние WhiteSpace и NewLine

3.0
let someString = "  Swift Language  \n"
let trimmedString = someString.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
// "Swift Language"

Метод stringByTrimmingCharactersInSet возвращает новую строку, выполненную путем удаления с обоих концов символов String, содержащихся в заданном наборе символов.

Мы также можем просто удалить только пробел или новую строку.

Удаление только пробелов:

let trimmedWhiteSpace = someString.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
// "Swift Language  \n"

Удаление только новой строки:

let trimmedNewLine = someString.stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet())
// "  Swift Language  "
3.0
let someString = "  Swift Language  \n"

let trimmedString = someString.trimmingCharacters(in: .whitespacesAndNewlines)
// "Swift Language"

let trimmedWhiteSpace = someString.trimmingCharacters(in: .whitespaces)
// "Swift Language  \n"

let trimmedNewLine = someString.trimmingCharacters(in: .newlines)
// "  Swift Language  "

Примечание: все эти методы принадлежат Foundation . Используйте import Foundation если Foundation еще не импортирован через другие библиотеки, такие как Cocoa или UIKit.

Преобразование строки в и из данных / NSData

Чтобы преобразовать String в и из Data / NSData, нам нужно закодировать эту строку с определенной кодировкой. Самым известным является UTF-8 который представляет собой 8-битное представление символов Unicode, пригодных для передачи или хранения на основе ASCII-систем. Вот список всех доступных String Encodings

String к Data / NSData

3.0
let data = string.data(using: .utf8)
2,2
let data = string.dataUsingEncoding(NSUTF8StringEncoding)

Data / NSData для String

3.0
let string = String(data: data, encoding: .utf8)
2,2
let string = String(data: data, encoding: NSUTF8StringEncoding)

Разделение строки в массив

В Swift вы можете легко разделить String на массив, отрезав его определенным символом:

3.0
let startDate = "23:51"

let startDateAsArray = startDate.components(separatedBy: ":") // ["23", "51"]`
2,2
let startDate = "23:51"

let startArray = startDate.componentsSeparatedByString(":") // ["23", "51"]`

Или когда разделителя нет:

3.0
let myText = "MyText"

let myTextArray = myText.components(separatedBy: " ") // myTextArray is ["MyText"]
2,2
let myText = "MyText"

let myTextArray = myText.componentsSeparatedByString(" ") // myTextArray is ["MyText"]


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow