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

719

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

var test1: String = "Scott"

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

  • 0
    возможный дубликат длины строки в Swift 1.2 и Swift 2.0
  • 0
    Мне пришлось перенести много кода вручную из-за Swift 3. Поэтому я решил создать расширения. Так что теперь, если придется переходить на новый основной выпуск, мне нужно перенести только расширение. Здесь вы можете найти некоторые расширения Swift 3, которые я создал. github.com/tukur187/Swift3
Теги:
string

45 ответов

1232
Лучший ответ

Начиная с 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

  • 10
    Интересно, что countElements является глобальной функцией. Есть ли список глобальных функций?
  • 5
    @ScottWalter: cmd-клик по символу Swift (например, String), и вы попадете к ним. В верхней части результирующего файла.
Показать ещё 19 комментариев
315

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
  • 25
    Я ценю ваш подробный и предупредительный ответ, но должен признать, что это оставило меня в неловком положении. Вы дали мне 3 способа получить длину строки, все с оговоркой, что ответы, которые они дают, могут не соответствовать вашим ожиданиям. Неужели в Swift нет надежного способа получить точное и надежное значение длины строки?
  • 6
    @ N00neimp0rtant. Извините, если я не дал понять. Первое решение ( countElements() ) получает точное количество символов в строке. Это может отличаться от того, что вы получите от вызова [str length] в Objective-C, потому что метод length предполагает, что все символы в строке состоят из 16-битных кодовых единиц, тогда как countElements() получает фактическое число Unicode персонажи. Однако в большинстве случаев все вышеперечисленные альтернативы будут давать одинаковые результаты, особенно если вы работаете с общими символами английского языка.
Показать ещё 8 комментариев
93

Обновление 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

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

extension String {
    var length: Int { return countElements(self) }  // Swift 1.1
}
extension String {
    var length: Int { return count(self)         }  // Swift 1.2
}
extension String {
    var length: Int { return characters.count    }  // Swift 2.0
}
extension String {
    var length: Int { return self.count }           // Swift 4.2
}
  • 6
    Да, нам нужен слой абстракции для синтаксиса Swift, который меняется ежемесячно!
  • 0
    @ Ли Это не работает в Swift 4., поскольку символы устарели. Бегущий по кругу гонщик продолжается. вздох
46

Swift 4

"string".count

;)

Swift 3

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

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

"string".length

  • 0
    Возвращает String.CharacterView.IndexDistance. А как насчет Int?
  • 0
    @ GitSync где? Я вас не понимаю
Показать ещё 5 комментариев
21

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

myString.isEmpty

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

NSString пуст

17

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
13

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

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

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

aString.utf16count

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

  • 2
    Смотрите ответ Цезаря. Это не обязательно даст вам количество «символов» в строке, для большинства людей определение «символ». С другой стороны, и Objective-C - и вам решать, волнует ли вас это или нет.
9

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

let string = "Some string"
count(string.utf16)
  • 1
    Это медленнее, чем .utf16count?
  • 1
    Кажется, та же скорость, что и .utf16count, намного быстрее, чем count (строка)
9

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

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

или

 var test1: String = "Scott"
 var length = test1.lengthOfBytesUsingEncoding(NSUTF16StringEncoding)
  • 0
    Когда вы используете сложные строки с Emoji, ответ с utf16count будет неправильным
7

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

var test1: String = "Scott"
var length =  test1.bridgeToObjectiveC().length
  • 3
    Это так же, как test1.utf16count
  • 0
    Все просто и работает.
Показать ещё 1 комментарий
6

Для 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
5

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

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

возвращает 24

4

Swift 4.2

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

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

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

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

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

string.endIndex.encodedOffset

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

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

3

В 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
2

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

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
    }
}
2

Swift 4

let str =  "Your name"

str.count 

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

2

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

let replacementTextAsDecimal = Double(string)

if string.characters.count > 0 &&
    replacementTextAsDecimal == nil &&
    replacementTextHasDecimalSeparator == nil {
        return false
}
  • 0
    Я думаю, что вы пытаетесь сделать больше, чем просто получить длину строки, и в любом случае это выглядит неполным (разве не должно быть return true случая?). Можете ли вы проверить еще раз и, в случае, отредактировать свой ответ? Спасибо!
2

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

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

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

let numberOfChars = textlength.characters.count
2

В Xcode 6.1.1

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

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

1

мои два цента для быстрой 3/4

Если вам нужно условно скомпилировать

    #if swift(>=4.0)
            let len = text.count
        #else
            let len = text.characters.count
        #endif
  • 0
    Хорошая точка зрения. Я скорее модернизируюсь до swift 4 по всем направлениям.
1

Обновление 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
1

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

myString.characters.count 

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

var count = myString.characters.count as Int
  • 2
    Distance String.CharacterView - это Int , в этом приведении быть не должно.
1

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

test1.characters.count

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

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

1
test1.characters.count

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

Пример:

test1 = "StackOverflow"

print(test1.characters.count)

( печать " 13" )

1

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

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

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

var str = "Hello World"
var length = count(str.utf16)
  • 2
    Вы должны использовать просто считать (ул). Попробуйте использовать счетчик (str.utf16) с подстрокой advance ()
1
var str = "Hello, playground"
var newString = str as NSString    

countElements(str)

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

countElements((newString as String))    

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

0
// String literal
let s = "Hello world" 
// Get the length of the string
let length = s.characters.count
print(length) 
0

В Swift 4.1 и Xcode 9.4.1

Чтобы получить длину в Objective C и Swift отличается. В Obj-c мы используем свойство length, но в Swift мы используем свойство count

Пример:

//In Swift
let stringLenght = "This is my String"
print(stringLenght.count)

//In Objective c
NSString * stringLenght = @"This is my String";
NSLog(@"%lu", stringLenght.length);
0

Свифт 2 и 3:

string.characters.count

Свифт 4:

string.count

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

0

Универсальное решение Swift 4 и 3

/**
 * Since swift 4 There is also native count, But it doesn't return Int
 * NOTE: was: var count:Int { return self.characters.count }
 * EXAMPLE: "abc".count//Output: 4
 */
extension String{
    var count:Int {
        return self.distance(from: self.startIndex, to: self.endIndex)
    }
}
0

если вы хотите подсчитать длину строки

Попробуйте сделать это очень просто:

Для Swift:

var test1: String = "Scott"

Ниже строки кода следует подсчитать длину строки:

test1.count

или вы также можете попробовать это:

test1.characters.count

Пусть это поможет вам.

Спасибо.

0

test1.endIndex дает тот же результат, что и test1.characters.count на Swift 3

0

Вы можете использовать str.utf8.count и str.utf16.count, которые, я думаю, являются лучшим решением

0

Вы можете добавить эту функцию к расширению

extension NSString { 
    func charLength() -> Int {
        return count(self as String)
    }
}
0

Использование Xcode 6.4, Swift 1.2 и iOS 8.4:

    //: Playground - noun: a place where people can play

    import UIKit

    var str = "  He\u{2606}  "
    count(str) // 7

    let length = count(str.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())) as Int // 3
    println(length == 3) // true
-1
let myString = "Hello this is testing string"
let length = myString.utf16.count
print("Length of the string : \(length)")

Это один из способов получить длину строки в swift.

-1

Для этого вы можете использовать SwiftString (https://github.com/amayne/SwiftString).

"string".length // 6

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я написал это расширение

-1

Objective-C:

String.length

Swift 2.0:

String.character.count
-2

Если вы ищете более простой способ получить длину строковой проверки этой библиотеки, которая имеет кучу расширений для встроенных классов Swift http://www.dollarswift.org/#length

Используя эту библиотеку, вы можете просто сделать "Some Str".length

-3

Swift 4

Это довольно простой в Swift 4.

str.count

Ещё вопросы

Сообщество Overcoder
Наверх
Меню