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

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

var test1: String = "Scott"

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

30 ответов


по состоянию на Swift 4

просто:

test1.count

по причинам.

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

по состоянию на Swift 2:

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

test1.characters.count

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

по состоянию на Swift 1

используйте метод count символов:

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


TLDR:

на 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 on characters.

из ссылки на язык:

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

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

примером, который прекрасно иллюстрирует ситуацию, описанную выше, является проверка длины строки, содержащей один символ emoji, как указано n00neimp0rtant в комментариях.

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

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

Swift 2.0, 3.0 и 3.1:

пусть strLength = string.письмена.рассчитывать

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

пусть strLength = string.граф!--3-->


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
}

Swift 4

"string".count

;)

Swift 3

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

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

"string".length


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

myString.isEmpty

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

NSString пуст


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

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

однако, в соответствии с CollectionType, что в свою очередь соответствует _CollectionType, строка осуществляет параметр startindex и endindex включительно вычисляемые свойства, которые фактически представляют позицию индекса до первый кластер символов и положение индекса после последний кластер символов, соответственно. Итак, в строке "ABC" позиция индекса до A равна 0, а после C равна 3. Следовательно,endindex включительно = 3, что также является длиной строки.

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

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

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

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

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

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

aString.utf16count

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


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

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

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

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

или

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

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

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

для 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

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

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

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

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

возвращает 24


Swift 2.0: Подсчитайте:yourString.text.characters.count

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

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

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"

В Xcode 6.1.1

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

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


получить строковое значение из вашего textview или textfield:

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

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

let numberOfChars = textlength.characters.count

на 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

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

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

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

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

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

countElements(str)

это подсчитывает символы в обычной строке Swift

countElements((newString as String))    

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


лучший способ подсчета строки в Swift:

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

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

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

test1.characters.count

будет Вам количество букв/цифр и т. д. В строке.

ex:

test1 = "StackOverflow"

print(test1.characters.count)

(печать "13")


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

test1.письмена.граф!--3-->

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

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


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

myString.characters.count 

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

var count = myString.characters.count as Int

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

let replacementTextAsDecimal = Double(string)

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

Swift 4 обновление по сравнению с swift 3

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

"hello".count                  // 5

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

"hello".characters.count       // 5

Swift 4.0 также принимает Unicode 9, и теперь он может интерпретировать кластеры графем. Например, в расчете на emoji даст вам 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

мои два цента за swift 3/4

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

    #if swift(>=4.0)
            let len = text.count
        #else
            let len = text.characters.count
        #endif

Swift 4

let str =  "Your name"

str.count 

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