Как вы получаете длину String
? Например, у меня есть переменная, определенная как:
var test1: String = "Scott"
Однако я не могу найти метод длины в строке.
Как вы получаете длину String
? Например, у меня есть переменная, определенная как:
var test1: String = "Scott"
Однако я не могу найти метод длины в строке.
Свифт 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
Для Swift 2.0 и 3.0 используйте test1.characters.count
. Но есть несколько вещей, которые вы должны знать. Итак, читайте дальше.
До 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
Обновление 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
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)
Swift 4
"string".count
;)
Swift 3
extension String {
var length: Int {
return self.characters.count
}
}
Использование
"string".length
Если вы просто пытаетесь увидеть, является ли строка пустой или нет (проверка на длину 0), Swift предлагает простой логический метод тестирования на String
myString.isEmpty
Другой стороной этой монеты были люди, которые спрашивали в ObjectiveC, как спросить, была ли строка пустой, где ответ должен был проверить длину 0:
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
Здесь нечто более короткое и более естественное, чем использование глобальной функции:
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
удалено. Теперь вы должны использовать глобальную функцию count()
и передать представление UTF16 строки. Пример ниже...
let string = "Some string"
count(string.utf16)
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"
Вы можете попробовать как это
var test1: String = "Scott"
var length = test1.bridgeToObjectiveC().length
Для 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🐶🐶🐶
в Swift 2.x показано, как найти длину строки
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)
}
В swift4 я всегда использовал string.count
до сегодняшнего дня я обнаружил, что
string.endIndex.encodedOffset
это лучшая замена, потому что она быстрее - для 50 000 символов строка примерно в 6 раз быстрее, чем .count
. .count
зависит от длины строки, но .endIndex.encodedOffset
- нет.
Но есть один НЕТ. Это не хорошо для строк с эмодзи, это даст неправильный результат, поэтому только .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
В Xcode 6.1.1
extension String {
var length : Int { return self.utf16Count }
}
Я думаю, что brainiacs изменят это на каждую второстепенную версию.
Получить строковое значение из текстового поля или текстового поля:
let textlengthstring = (yourtextview?.text)! as String
Найти количество символов в строке:
let numberOfChars = textlength.characters.count
Вот что я закончил делать
let replacementTextAsDecimal = Double(string)
if string.characters.count > 0 &&
replacementTextAsDecimal == nil &&
replacementTextHasDecimalSeparator == nil {
return false
}
Обновление 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
Swift 4
let str = "Your name"
str.count
Помните: пробел также подсчитывается в числе
Вы можете получить длину, просто написав расширение:
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
}
}
var str = "Hello, playground"
var newString = str as NSString
countElements(str)
Это подсчитывает символы в строке регулярной строки
countElements((newString as String))
Это подсчитывает символы в NSString
Лучший способ подсчета String в Swift:
var str = "Hello World"
var length = count(str.utf16)
String и NSString являются бесплатным мостом, поэтому вы можете использовать все доступные методы NSString со строкой String
let x = "test" as NSString
let y : NSString = "string 2"
let lenx = x.count
let leny = y.count
test1.characters.count
вы получите количество букв/чисел и т.д. в вашей строке.
Пример:
test1 = "StackOverflow"
print(test1.characters.count)
( печать " 13" )
Apple отличалась от других основных языков. Текущий способ - вызвать:
test1.characters.count
Однако, чтобы быть осторожным, когда вы говорите длину, вы имеете в виду количество символов, а не количество байтов, потому что эти два могут отличаться при использовании символов, отличных от ascii.
Например; "你好啊hi".characters.count
даст вам 5, но это не количество байтов. Чтобы получить реальное количество байтов, вам нужно сделать "你好啊hi".lengthOfBytes(using: String.Encoding.utf8)
. Это даст вам 11.
Прямо сейчас (в Swift 2.3), если вы используете:
myString.characters.count
метод вернет тип "Расстояние", если вам нужен метод для возвращения целого, который вы должны набирать следующим образом:
var count = myString.characters.count as Int