Получить длину строки

Как вы получаете длину String? Например, у меня есть переменная, определенная как:

var test1: String = "Scott"

Однако я не могу найти метод длины в строке.

Ответ 1

Свифт 5+:

test1.count

(строки Swift 5.0 могут, в некоторых отношениях, просто рассматриваться как массив. Следовательно, вы можете использовать .count или, например, .first)


Начиная со Swift 4

Это просто:

test1.count

по причинам.

(Спасибо Мартину Р.)

Начиная со Swift 2:

С Swift 2 Apple изменила глобальные функции на расширения протокола, расширения, которые соответствуют любому типу, соответствующему протоколу. Таким образом, новый синтаксис:

test1.characters.count

(спасибо JohnDifool за хедз-ап)

По состоянию на Свифт 1

Используйте метод подсчета символов:

let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
println("unusualMenagerie has \(count(unusualMenagerie)) characters")
// prints "unusualMenagerie has 40 characters"

прямо из руководства Apple Swift

(обратите внимание, что для версий Swift более ранних, чем 1.2, это будет countElements(unusualMenagerie) вместо этого)

для вашей переменной это будет

length = count(test1) // was countElements in earlier versions of Swift

Или вы можете использовать test1.utf16count

Ответ 2

TL;DR:

Для Swift 2.0 и 3.0 используйте test1.characters.count. Но есть несколько вещей, которые вы должны знать. Итак, читайте дальше.

Подсчет символов в Swift

До Swift 2.0 функция count была глобальной. С Swift 2.0 его можно назвать функцией-членом.

test1.characters.count

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

Однако из-за способа Strings реализованы в Swift, символы не всегда занимают одинаковый объем памяти, поэтому имейте в виду, что это ведет себя совсем по-другому, чем обычные методы подсчета символов на других языках.

Например, вы также можете использовать test1.utf16.count

Но, как отмечено ниже, возвращаемое значение не гарантируется таким же, как и для вызова count на characters.

С помощью ссылки на язык:

Расширенные кластеры графем могут состоять из одного или нескольких Unicode скаляры. Это означает, что разные символы - и разные представления одного и того же символа - могут потребовать разные количества память для хранения. Из-за этого персонажи в Свифте не каждый до того же объема памяти в представлении строк. Как результат, количество символов в строке не может быть вычислено без итерации через строку, чтобы определить ее расширенную графемные границы кластера. Если вы работаете особенно долго значения строки, помните, что свойство символов должно проходить через сканеры Unicode во всей строке, чтобы определить символов для этой строки.

Количество символов, возвращаемых свойством символов, не является всегда то же самое, что и свойство длины NSString, которое содержит те же персонажи. Длина NSString основана на числе из 16-битных кодовых блоков в строках представления UTF-16, а не число Unicode расширенных кластеров графемы в строке.

Пример, который отлично иллюстрирует описанную выше ситуацию, - это проверка длины строки, содержащей один символ эмози, как указано n00neimp0rtant в комментарии.

var emoji = "👍"
emoji.characters.count             //returns 1
emoji.utf16.count                  //returns 2

Ответ 3

Обновление Swift 1.2: больше не существует countElements для подсчета размера коллекций. Просто используйте функцию подсчета в качестве замены: count ("Swift")

Swift 2.0, 3.0 и 3.1:

let strLength = string.characters.count

Swift 4.2 (начиная с 4.0): [Документация Apple - Строки]

let strLength = string.count

Ответ 4

Swift 1.1

extension String {
    var length: Int { return countElements(self) }  // 
}

Swift 1.2

extension String {
    var length: Int { return count(self)         }  // 
}

Swift 2.0

extension String {
    var length: Int { return characters.count    }  // 
}

Swift 4.2

extension String {
    var length: Int { return self.count }           
}

let str = "Hello"
let count = str.length    // returns 5 (Int)

Ответ 5

Swift 4

"string".count

;)

Swift 3

extension String {
    var length: Int {
        return self.characters.count
    }
}

Использование

"string".length

Ответ 6

Если вы просто пытаетесь увидеть, является ли строка пустой или нет (проверка на длину 0), Swift предлагает простой логический метод тестирования на String

myString.isEmpty

Другой стороной этой монеты были люди, которые спрашивали в ObjectiveC, как спросить, была ли строка пустой, где ответ должен был проверить длину 0:

NSString пуст

Ответ 7

tl; dr Если вам нужна длина типа String в терминах количества человекочитаемых символов, используйте countElements(). Если вы хотите узнать длину с точки зрения количества расширенных кластеров графем, используйте endIndex. Читайте подробнее.

Тип String реализуется как упорядоченная коллекция (т.е. последовательность) символов Unicode и соответствует протоколу CollectionType, который соответствует _CollectionType, который является типом ввода, ожидаемым countElements(). Поэтому можно вызвать countElements(), передав тип String, и он вернет количество символов.

Однако, в соответствии с CollectionType, который в свою очередь соответствует _CollectionType, String также реализует startIndex и endIndex, которые фактически представляют позицию индекса перед первым кластером символов и позицию индекса после последнего кластера символов, соответственно. Таким образом, в строке "ABC" позиция индекса перед A равна 0 и после C равна 3. Следовательно, endIndex= 3, которая также является длиной строки.

Итак, endIndex можно использовать для получения длины любого типа String, а затем?

Ну, не всегда... Юникод-символы - это на самом деле расширенные кластеры графемы, которые представляют собой последовательности одного или нескольких сканеров Unicode, объединенных для создания одного человека, читаемого символом.

let circledStar: Character = "\u{2606}\u{20DD}" // ☆⃝

circledStar - это одиночный символ, состоящий из U + 2606 (белая звезда) и U + 20DD (комбинация окружающего круга). Создайте String из circledStar и сравните результаты countElements() и endIndex.

let circledStarString = "\(circledStar)"
countElements(circledStarString) // 1
circledStarString.endIndex // 2

Ответ 8

Здесь нечто более короткое и более естественное, чем использование глобальной функции:

aString.utf16count

Я не знаю, доступен ли он в бета-версии 1. Но он определенно присутствует в бета-версии 2.

Ответ 9

В Swift 2.0 count больше не работает. Вы можете использовать это вместо:

var testString = "Scott"
var length = testString.characters.count

Ответ 10

Обновлен для Xcode 6 beta 4, метод изменения utf16count → utf16Count

 var test1: String = "Scott"
 var length =  test1.utf16Count

или

 var test1: String = "Scott"
 var length = test1.lengthOfBytesUsingEncoding(NSUTF16StringEncoding)

Ответ 11

С Swift 1.2 utf16Count удалено. Теперь вы должны использовать глобальную функцию count() и передать представление UTF16 строки. Пример ниже...

let string = "Some string"
count(string.utf16)

Ответ 12

Swift 5.1, 5

let flag = "🇵🇷"

print(flag.count)
// Prints "1" --  Counts the characters and emoji as length 1

print(flag.unicodeScalars.count)
// Prints "2" --  Counts the unicode lenght ex. "A" is 65

print(flag.utf16.count)
// Prints "4"

print(flag.utf8.count)
// Prints "8"

Ответ 13

Вы можете попробовать как это

var test1: String = "Scott"
var length =  test1.bridgeToObjectiveC().length

Ответ 14

Для XCode 7.3 и Swift 2.2.

let str = "🐶"

1) Если вы хотите количество визуальных символов:

str.characters.count // 1

2) Если вы хотите 16-bit code units within the string’s UTF-16 representation:

str.utf16.count // 2



В большинстве случаев 1) - это то, что вам нужно.

Когда вам понадобится 2)? Я нашел вариант использования для 2):

let regex = try! NSRegularExpression(pattern:"🐶", 
    options: NSRegularExpressionOptions.UseUnixLineSeparators)
let str = "🐶🐶🐶🐶🐶🐶"
let result = regex.stringByReplacingMatchesInString(str, 
    options: NSMatchingOptions.WithTransparentBounds, 
    range: NSMakeRange(0, str.utf16.count), withTemplate: "dog")
print(result) // dogdogdogdogdogdog

Если вы используете 1), результат неверен:

let result = regex.stringByReplacingMatchesInString(str, 
    options: NSMatchingOptions.WithTransparentBounds, 
    range: NSMakeRange(0, str.characters.count), withTemplate: "dog")
print(result) // dogdogdog🐶🐶🐶

Ответ 15

в Swift 2.x показано, как найти длину строки

let findLength = "This is a string of text"
findLength.characters.count

возвращает 24

Ответ 16

Swift 2.0: Получить счетчик: yourString.text.characters.count

Интересным примером того, как это полезно, было бы показать обратный отсчет символа от некоторого числа (например, 150) в UITextView:

func textViewDidChange(textView: UITextView) {
    yourStringLabel.text = String(150 - yourStringTextView.text.characters.count)
}

Ответ 17

В swift4 я всегда использовал string.count до сегодняшнего дня я обнаружил, что

string.endIndex.encodedOffset

это лучшая замена, потому что она быстрее - для 50 000 символов строка примерно в 6 раз быстрее, чем .count. .count зависит от длины строки, но .endIndex.encodedOffset - нет.

Но есть один НЕТ. Это не хорошо для строк с эмодзи, это даст неправильный результат, поэтому только .count является правильным.

Ответ 18

В Swift 4: если строка не содержит символов Юникода, используйте следующее

let str : String = "abcd"
let count = str.count // output 4

Если строка содержит символы Юникода, используйте следующее:

let spain = "España"
let count1 = spain.count // output 6
let count2 = spain.utf8.count // output 7

Ответ 19

В Xcode 6.1.1

extension String {    
    var length : Int { return self.utf16Count  }
}

Я думаю, что brainiacs изменят это на каждую второстепенную версию.

Ответ 20

Получить строковое значение из текстового поля или текстового поля:

let textlengthstring = (yourtextview?.text)! as String

Найти количество символов в строке:

let numberOfChars = textlength.characters.count

Ответ 21

Вот что я закончил делать

let replacementTextAsDecimal = Double(string)

if string.characters.count > 0 &&
    replacementTextAsDecimal == nil &&
    replacementTextHasDecimalSeparator == nil {
        return false
}

Ответ 22

Обновление Swift 4 по сравнению с быстрым 3

Swift 4 удаляет необходимость в массиве символов в String. Это означает, что вы можете напрямую вызвать count в строке, не получив сначала массив символов.

"hello".count                  // 5

В то время как в swift 3 вам нужно будет получить массив символов, а затем подсчитать элемент в этом массиве. Обратите внимание, что этот следующий метод все еще доступен в swift 4.0, поскольку вы все равно можете вызвать characters для доступа к массиву символов данной строки

"hello".characters.count       // 5

Swift 4.0 также использует Unicode 9, и теперь он может интерпретировать кластеры grapheme. Например, подсчет эможи даст вам 1, а в swift 3.0, вы можете получить количество больше 1.

"👍🏽".count // Swift 4.0 prints 1, Swift 3.0 prints 2
"👨‍❤️‍💋‍👨".count // Swift 4.0 prints 1, Swift 3.0 prints 4

Ответ 23

Swift 4

let str =  "Your name"

str.count 

Помните: пробел также подсчитывается в числе

Ответ 24

Вы можете получить длину, просто написав расширение:

extension String {
    // MARK: Use if it Swift 2
    func stringLength(str: String) -> Int {
        return str.characters.count
    }

    // MARK: Use if it Swift 3
    func stringLength(_ str: String) -> Int {
        return str.characters.count
    }

    // MARK: Use if it Swift 4
    func stringLength(_ str: String) -> Int {
        return str.count
    }
}

Ответ 25

var str = "Hello, playground"
var newString = str as NSString    

countElements(str)

Это подсчитывает символы в строке регулярной строки

countElements((newString as String))    

Это подсчитывает символы в NSString

Ответ 26

Лучший способ подсчета String в Swift:

var str = "Hello World"
var length = count(str.utf16)

Ответ 27

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

let x = "test" as NSString
let y : NSString = "string 2"
let lenx = x.count
let leny = y.count

Ответ 28

test1.characters.count

вы получите количество букв/чисел и т.д. в вашей строке.

Пример:

test1 = "StackOverflow"

print(test1.characters.count)

( печать " 13" )

Ответ 29

Apple отличалась от других основных языков. Текущий способ - вызвать:

test1.characters.count

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

Например;     "你好啊hi".characters.count даст вам 5, но это не количество байтов.     Чтобы получить реальное количество байтов, вам нужно сделать "你好啊hi".lengthOfBytes(using: String.Encoding.utf8). Это даст вам 11.

Ответ 30

Прямо сейчас (в Swift 2.3), если вы используете:

myString.characters.count 

метод вернет тип "Расстояние", если вам нужен метод для возвращения целого, который вы должны набирать следующим образом:

var count = myString.characters.count as Int