Як ви отримуєте довжину String
? Наприклад, у мене є змінна, визначена як:
var test1: String = "Scott"
Однак я не можу знайти метод довжини на рядку.
Як ви отримуєте довжину String
? Наприклад, у мене є змінна, визначена як:
var test1: String = "Scott"
Однак я не можу знайти метод довжини на рядку.
Відповіді:
Станом на Swift 4+
Це просто:
test1.count
з причин.
(Спасибі Мартіну Р.)
Станом на Swift 2:
З Swift 2 Apple змінила глобальні функції на розширення протоколу, розширення, які відповідають будь-якому типу, що відповідає протоколу. Таким чином, новий синтаксис:
test1.characters.count
(Дякую JohnDifool за голову вгору)
Станом на Swift 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
string.count
.
Для Swift 2.0 та 3.0 використовуйте test1.characters.count
. Але, ви повинні знати кілька речей. Отже, читайте далі.
До Swift 2.0 count
була глобальною функцією. Що стосується Swift 2.0, його можна назвати функцією члена.
test1.characters.count
Він поверне фактичну кількість символів Unicode в String
, так що це найбільш правильна альтернатива в тому сенсі, що, якщо ви надрукували рядок і порахували символи вручну, ви отримали б той самий результат.
Однак через те, як Strings
реалізовано в Swift, символи не завжди займають однаковий об'єм пам'яті, тому майте на увазі, що це поводиться зовсім інакше, ніж звичайні методи підрахунку символів в інших мовах.
Наприклад, ви також можете використовувати test1.utf16.count
Але, як зазначено нижче, повертається значення не гарантовано бути такою ж , як і виклику count
на characters
.
З мовної довідки:
Розширені кластери графеми можуть складатися з одного або декількох скалярів Unicode. Це означає, що різні символи - і різні зображення одного і того ж символу - можуть вимагати різного обсягу пам'яті для зберігання. Через це символи Swift не займають однаковий об'єм пам'яті в рамках представлення рядка. В результаті кількість символів у рядку не може бути обчислена без ітерації через рядок для визначення її розширених меж кластеру графем. Якщо ви працюєте з особливо довгими рядковими значеннями, майте на увазі, що властивість символів повинна повторюватися над скалярами Unicode у всій рядку, щоб визначити символи для цього рядка.
Кількість символів, повернених властивістю символів, не завжди збігається з властивістю довжини NSString, що містить ті самі символи. Довжина NSString заснована на кількості 16-бітових кодових одиниць у представленні UTF-16 рядка, а не на кількості розширених кластерних графем Unicode всередині рядка.
Приклад, який ідеально ілюструє описану вище ситуацію, - це перевірка довжини рядка, що містить єдиний символ емоджи, на що вказує n00neimp0rtant у коментарях.
var emoji = "👍"
emoji.characters.count //returns 1
emoji.utf16.count //returns 2
countElements()
) отримує точну кількість символів у рядку. Це може відрізнятися від того, що ви отримаєте від виклику [str length]
в Objective-C, оскільки length
метод передбачає, що всі символи в рядку складаються з 16-бітних одиниць коду, при цьому countElements()
отримується фактична кількість символів Unicode. Однак більшу частину часу всі вищезазначені альтернативи повертають однакові результати, особливо якщо ви працюєте з загальними символами англійської мови.
Swift 1.2 Оновлення: більше немає countElements для підрахунку розміру колекцій. Просто використовуйте функцію підрахунку як заміну: count ("Swift")
Swift 2.0, 3.0 та 3.1:
нехай strLength = string.characters.count
Swift 4.2 (4.0 далі): [Документація Apple - Струни]
нехай strLength = string.count
Швидкий 1.1
extension String {
var length: Int { return countElements(self) } //
}
Швидкий 1.2
extension String {
var length: Int { return count(self) } //
}
Швидкий 2.0
extension String {
var length: Int { return characters.count } //
}
Швидкий 4.2
extension String {
var length: Int { return self.count }
}
let str = "Hello"
let count = str.length // returns 5 (Int)
Швидкий 4
"string".count
;)
Швидкий 3
extension String {
var length: Int {
return self.characters.count
}
}
використання
"string".length
//: Playground - noun: a place where people can play import UIKit var str = "Hello, playground" print(type(of: str.characters.count)) print(type(of: str.count))
Якщо ви просто намагаєтесь побачити, чи рядок порожній чи ні (перевірка довжини 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 можна використовувати для отримання довжини будь-якого типу рядка, значить, правда?
Ну, не завжди ... Символи Unicode - це фактично розширені кластери графем , що є послідовностями одного або декількох скалярів 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.
Оновлено для Xcode 6 beta 4, змінити метод utf16count -> utf16Count
var test1: String = "Scott"
var length = test1.utf16Count
Або
var test1: String = "Scott"
var length = test1.lengthOfBytesUsingEncoding(NSUTF16StringEncoding)
utf16count
буде помилковою
Станом на Swift 1.2 utf16Count
було видалено. Тепер вам слід використовувати глобальну count()
функцію та передати UTF16 подання рядка. Приклад нижче ...
let string = "Some string"
count(string.utf16)
Для Xcode 7.3 та Swift 2.2.
let str = "🐶"
Якщо ви хочете кількість візуальних символів:
str.characters.count
Якщо ви хочете, щоб "16-бітні одиниці коду в представленні UTF-16 рядка":
str.utf16.count
Більшість часу 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.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 : Якщо рядок не містить символів unicode, використовуйте наступне
let str : String = "abcd"
let count = str.count // output 4
Якщо рядок містить символи unicode, використовуйте наступне:
let spain = "España"
let count1 = spain.count // output 6
let count2 = spain.utf8.count // output 7
utf8.count
? Це не дає кількість символів. Він дає кількість байтів, необхідних для кодування UTF-8 рядка.
У 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
}
return true
справи?). Чи можете ви перевірити ще раз і, на випадок, відредагувати свою відповідь? Дякую!
Оновлення Swift 4 порівняно з Swift 3
Swift 4 усуває потребу в масиві символів на String. Це означає, що ви можете безпосередньо дзвонити count
по рядку, не отримуючи попередньо масив символів.
"hello".count // 5
Тоді як у швидкому 3 вам доведеться отримати масив символів, а потім порахувати елемент у цьому масиві. Зауважте, що наступний метод все ще доступний у швидкій версії 4.0, оскільки ви все ще можете зателефонувати, characters
щоб отримати доступ до масиву символів даної рядки
"hello".characters.count // 5
Swift 4.0 також приймає Unicode 9 і тепер він може інтерпретувати кластери графеми. Наприклад, якщо порахувати емоджи, ви отримаєте 1 при швидкій версії 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
Ви можете отримати довжину, просто написавши розширення:
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)
Це враховує символів у Regular Swift String
countElements((newString as String))
Це рахує символів у NSString
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
метод поверне тип "Відстань", якщо вам потрібен метод для повернення Integer, слід ввести ролик таким чином:
var count = myString.characters.count as Int
Distance
З String.CharacterView
це Int
, не повинно бути ніякої необхідності в цьому кидку.