A'nın uzunluğunu nasıl elde edersiniz String
? Örneğin, şöyle tanımlanmış bir değişken var:
var test1: String = "Scott"
Ancak, dizede bir uzunluk yöntemi bulamıyorum.
A'nın uzunluğunu nasıl elde edersiniz String
? Örneğin, şöyle tanımlanmış bir değişken var:
var test1: String = "Scott"
Ancak, dizede bir uzunluk yöntemi bulamıyorum.
Yanıtlar:
Swift 4+ itibariyle
Bu sadece:
test1.count
nedenlerle.
(Martin R sayesinde)
Swift 2'den itibaren:
Swift 2 ile Apple, global işlevleri protokol uzantılarına, bir protokole uyan her türle eşleşen uzantılara değiştirdi. Böylece yeni sözdizimi:
test1.characters.count
(JohnDifool'a başkanlık için teşekkürler)
Swift itibariyle 1
Sayı karakterleri yöntemini kullanın:
let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
println("unusualMenagerie has \(count(unusualMenagerie)) characters")
// prints "unusualMenagerie has 40 characters"
doğrudan Apple Swift Kılavuzu'ndan
(not, Swift'in 1.2'den önceki sürümleri için, countElements(unusualMenagerie)
bunun yerine)
değişkeniniz için
length = count(test1) // was countElements in earlier versions of Swift
Veya test1.utf16count kullanabilirsiniz
string.count
.
İçin Swift 2.0 ve 3.0, kullanım test1.characters.count
. Ancak bilmeniz gereken birkaç şey var. Yani, okumaya devam edin.
Swift 2.0'dan önce count
küresel bir işlevdi. Swift 2.0'dan itibaren üye işlevi olarak adlandırılabilir.
test1.characters.count
Gerçek Unicode karakter sayısını a döndürür String
, bu nedenle dizeyi yazdırır ve karakterleri el ile sayarsanız aynı sonucu elde etmeniz açısından en doğru alternatif budur.
Bununla birlikte, Strings
Swift'te uygulanma şekli nedeniyle , karakterler her zaman aynı miktarda bellek kullanmazlar, bu yüzden bunun diğer dillerdeki normal karakter sayısı yöntemlerinden oldukça farklı davrandığını unutmayın.
Örneğin, test1.utf16.count
Aşağıda belirtildiği gibi,, döndürülen değer çağıran aynı olması garanti edilmez count
üzerinde characters
.
Dil referansından:
Genişletilmiş grafik kümeleri, bir veya daha fazla Unicode skalerden oluşabilir. Bu, farklı karakterlerin ve aynı karakterin farklı sunumlarının depolanması için farklı miktarlarda bellek gerektirebileceği anlamına gelir. Bu nedenle, Swift'teki karakterlerin her biri, bir dizenin temsili içinde aynı miktarda bellek almaz. Sonuç olarak, bir dizedeki karakter sayısı, genişletilmiş grafik küme sınırlarını belirlemek için dize yinelemeden hesaplanamaz. Özellikle uzun dize değerleriyle çalışıyorsanız, o dizenin karakterlerini belirlemek için characters özelliğinin tüm dize içindeki Unicode skalerlerini yinelemesi gerektiğini unutmayın.
Characters özelliği tarafından döndürülen karakterlerin sayısı, her zaman aynı karakterleri içeren bir NSString öğesinin length özelliğiyle aynı değildir. NSString'in uzunluğu, dizenin içindeki Unicode genişletilmiş grafik kümelerinin sayısını değil, dizenin UTF-16 gösterimi içindeki 16 bit kod birimlerinin sayısını temel alır.
Yukarıda açıklanan durumu mükemmel bir şekilde gösteren bir örnek , yorumlarda n00neimp0rtant tarafından işaret edildiği gibi, tek bir emoji karakteri içeren bir dizenin uzunluğunu kontrol etmektir .
var emoji = "👍"
emoji.characters.count //returns 1
emoji.utf16.count //returns 2
countElements()
) Dize'deki tam karakter sayısını alır. Gerçekte Unicode karakter sayısını alırken [str length]
, length
yöntem dizedeki tüm karakterlerin 16 bit kod birimlerinden oluştuğunu varsayacağından , Objective-C'de çağırmanızdan farklı olabilir countElements()
. Ancak, çoğu zaman yukarıdaki alternatiflerin tümü, özellikle İngilizce ortak karakterlerle çalışıyorsanız, aynı sonuçları döndürür.
Swift 1.2 Güncellemesi: Artık koleksiyonların sayısını saymak için bir countElements yok. Sadece sayma işlevini yedek olarak kullanın: count ("Swift")
Swift 2.0, 3.0 ve 3.1:
let strLength = string.characters.count
Swift 4.2 (4.0 sonrası): [Apple Belgeleri - Dizeler]
let strLength = string.count
Hızlı 1.1
extension String {
var length: Int { return countElements(self) } //
}
Hızlı 1.2
extension String {
var length: Int { return count(self) } //
}
Swift 2.0
extension String {
var length: Int { return characters.count } //
}
Hızlı 4.2
extension String {
var length: Int { return self.count }
}
let str = "Hello"
let count = str.length // returns 5 (Int)
Hızlı 4
"string".count
;)
Hızlı 3
extension String {
var length: Int {
return self.characters.count
}
}
kullanım
"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))
Bir dizenin boş olup olmadığını görmeye çalışıyorsanız (0 uzunluğunu kontrol edin), Swift basit bir boole testi yöntemi sunar. String
myString.isEmpty
Bu madalyonun diğer tarafı, ObjectiveC'de cevabın 0 olup olmadığını kontrol etmek için nerede bir dize boş olup olmadığını nasıl soracağını soran insanlardı:
tl; dr Bir String türünün insan tarafından okunabilir karakter sayısı olarak uzunluğunu istiyorsanız countElements () kullanın . Uzunluğu, genişletilmiş grafik kümeleri sayısı olarak bilmek istiyorsanız endIndex kullanın . Ayrıntılar için okumaya devam edin.
Yaylı türü sıralı bir toplama Unicode karakterleri (yani, dizi) olarak uygulanır ve bu uygun CollectionType protokolü, hangi uygundur _CollectionType beklenen giriş türüdür protokol countElements () . Bu nedenle, bir String türünü geçerek countElements () çağrılabilir ve karakter sayısını döndürür.
Ancak uymakta CollectionType için dönüş uygun olup içinde, _CollectionType , Dize de uygular startIndex ve endIndex aslında endeksi pozisyonunu temsil bilgisayarlı özelliklerini, önce ilk karakter kümesi ve dizinin pozisyonunda sonra , son karakter kümesi sırasıyla . Yani, "ABC" dizesinde, dizinin A'dan önceki konumu 0 ve C'den sonra 3'tür. Bu nedenle, dizenin uzunluğu olan endIndex = 3.
Yani, endIndex herhangi bir String türünün uzunluğunu elde etmek için kullanılabilir, değil mi?
Her zaman değil ... Unicode karakterler aslında tek bir insan tarafından okunabilir karakter oluşturmak için bir veya daha fazla Unicode skalerinin dizisi olan genişletilmiş grafik kümeleridir .
let circledStar: Character = "\u{2606}\u{20DD}" // ☆⃝
circledStar , U + 2606 (beyaz bir yıldız) ve U + 20DD'den (birleşik bir çevreleyen daire) oluşan tek bir karakterdir. Diyelim bir oluşturmak Dize gelen circledStar ve sonuçlarını karşılaştırmak countElements () ve endIndex .
let circledStarString = "\(circledStar)"
countElements(circledStarString) // 1
circledStarString.endIndex // 2
İşte küresel bir işlevi kullanmaktan daha kısa ve daha doğal bir şey:
aString.utf16count
Yine de beta 1'de mevcut olup olmadığını bilmiyorum. Ama beta 2'de kesinlikle var.
Xcode 6 beta 4 için güncellendi, utf16count yöntemini değiştirin -> utf16Count
var test1: String = "Scott"
var length = test1.utf16Count
Veya
var test1: String = "Scott"
var length = test1.lengthOfBytesUsingEncoding(NSUTF16StringEncoding)
utf16count
yanlış olacaktır
Swift 1.2 utf16Count
itibariyle kaldırıldı. Şimdi global count()
işlevi kullanmalı ve dizenin UTF16 görünümünü geçirmelisiniz. Aşağıdaki örnek ...
let string = "Some string"
count(string.utf16)
Xcode 7.3 ve Swift 2.2 için.
let str = "🐶"
Görsel karakter sayısını istiyorsanız:
str.characters.count
"Dizenin UTF-16 temsili içindeki 16 bit kod birimleri" istiyorsanız:
str.utf16.count
Çoğu zaman, 1 ihtiyacınız olan şeydir.
Ne zaman 2 gerekir ? 2 için bir kullanım durumu buldum :
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 kullanırsanız , sonuç yanlış olur:
let result = regex.stringByReplacingMatchesInString(str,
options: NSMatchingOptions.WithTransparentBounds,
range: NSMakeRange(0, str.characters.count), withTemplate: "dog")
print(result) // dogdogdog🐶🐶🐶
Swift 2.0: Sayım yapın: yourString.text.characters.count
Bunun ne kadar yararlı olduğuna dair eğlenceli bir örnek, bir UITextView içindeki bir sayıdan (örneğin 150) bir karakter geri sayımını göstermek olacaktır:
func textViewDidChange(textView: UITextView) {
yourStringLabel.text = String(150 - yourStringTextView.text.characters.count)
}
Swift4'te her zaman string.count
bugüne kadar kullandım ki
string.endIndex.encodedOffset
çünkü daha hızlıdır - 50 000 karakter için dize yaklaşık 6 kat daha hızlıdır .count
. .count
Dize uzunluğuna bağlıdır ama .endIndex.encodedOffset
yok.
Ama bir HAYIR var. Emojisi olan dizeler için iyi değildir, yanlış sonuç verir, bu yüzden sadece .count
doğrudur.
In Swift 4 : string yaparsa Unicode karakterleri sonra aşağıdaki kullanmak içermez
let str : String = "abcd"
let count = str.count // output 4
Dize unicode karakterleri içeriyorsa aşağıdakileri kullanın:
let spain = "España"
let count1 = spain.count // output 6
let count2 = spain.utf8.count // output 7
utf8.count
? Bu karakter sayısını vermez. Dizenin UTF-8 kodlaması için gereken bayt sayısını verir.
Xcode 6.1.1'de
extension String {
var length : Int { return self.utf16Count }
}
Beyinciklerin her küçük versiyonda bunu değiştireceğini düşünüyorum.
Metin görünümünüzden veya metin alanınızdan dize değeri alın:
let textlengthstring = (yourtextview?.text)! as String
Dizedeki karakter sayısını bulun:
let numberOfChars = textlength.characters.count
İşte yaptığım şey
let replacementTextAsDecimal = Double(string)
if string.characters.count > 0 &&
replacementTextAsDecimal == nil &&
replacementTextHasDecimalSeparator == nil {
return false
}
return true
durumda olmamalı ?). Lütfen tekrar kontrol edip, cevabınızı düzenleyebilir misiniz? Teşekkür ederim!
Swift 3 ile karşılaştırıldığında Swift 4 güncellemesi
Swift 4, String'de bir karakter dizisi ihtiyacını ortadan kaldırır. Bu, count
önce karakter dizisini almadan önce bir dizeyi doğrudan çağırabileceğiniz anlamına gelir .
"hello".count // 5
Oysa hızlı 3'te, karakterler dizisini almanız ve daha sonra bu dizideki öğeyi saymanız gerekir. characters
Belirtilen dizenin karakter dizisine erişmeye devam edebileceğiniz için, aşağıdaki yöntem hala hızlı 4.0'da kullanılabilir.
"hello".characters.count // 5
Swift 4.0 ayrıca Unicode 9'u benimser ve şimdi grafik kümelerini yorumlayabilir. Örneğin, bir emoji'ye güvenmek, hızlı 3.0'da 1 verir, 1'den büyük sayılar alabilirsiniz.
"👍🏽".count // Swift 4.0 prints 1, Swift 3.0 prints 2
"👨❤️💋👨".count // Swift 4.0 prints 1, Swift 3.0 prints 4
Uzunluğu basitçe bir uzantı yazarak alabilirsiniz:
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)
Bu, Düzenli Swift Dizesindeki karakterleri sayar
countElements((newString as String))
Bu, bir NSString'deki karakterleri sayar
test1.characters.count
dizenizdeki harflerin / sayıların vb. sayısını alırsınız.
örn:
test1 = "StackOverflow"
print(test1.characters.count)
( " 13 " yazdırır )
Apple diğer ana dilden farklı kıldı. Mevcut yol:
test1.characters.count
Ancak, dikkatli olmak için, uzunluk derken, bayt sayısı değil karakter sayımı anlamına gelirsiniz, çünkü ascii olmayan karakterler kullandığınızda bu ikisi farklı olabilir.
Örneğin;
"你好啊hi".characters.count
size 5 verecek ama bu bayt sayısı değil. Gerçek bayt sayısını elde etmek için yapmanız gerekir "你好啊hi".lengthOfBytes(using: String.Encoding.utf8)
. Bu size 11 verecek.
Şu anda (Swift 2.3'te) kullanıyorsanız:
myString.characters.count
yöntem bir "Distance" türü döndürür, eğer bir Integer döndürmek için yönteme ihtiyacınız varsa cast şöyle yazmalısınız:
var count = myString.characters.count as Int
Distance
Arasında String.CharacterView
olan Int
bu döküm gerek yoktur olmalı.