Bagaimana Anda mendapatkan panjang String
? Sebagai contoh, saya memiliki variabel yang didefinisikan seperti:
var test1: String = "Scott"
Namun, sepertinya saya tidak dapat menemukan metode panjang pada string.
Bagaimana Anda mendapatkan panjang String
? Sebagai contoh, saya memiliki variabel yang didefinisikan seperti:
var test1: String = "Scott"
Namun, sepertinya saya tidak dapat menemukan metode panjang pada string.
Jawaban:
Mulai dari Swift 4+
Hanya saja:
test1.count
karena alasan.
(Terima kasih kepada Martin R)
Mulai dari Swift 2:
Dengan Swift 2, Apple telah mengubah fungsi global menjadi ekstensi protokol, ekstensi yang cocok dengan jenis apa pun yang sesuai dengan protokol. Jadi sintaks baru adalah:
test1.characters.count
(Terima kasih kepada JohnDifool untuk kepala)
Mulai dari Swift 1
Gunakan metode jumlah karakter:
let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
println("unusualMenagerie has \(count(unusualMenagerie)) characters")
// prints "unusualMenagerie has 40 characters"
langsung dari Panduan Apple Swift
(perhatikan, untuk versi Swift lebih awal dari 1.2, ini akan menjadi countElements(unusualMenagerie)
sebagai gantinya)
untuk variabel Anda, itu akan menjadi
length = count(test1) // was countElements in earlier versions of Swift
Atau Anda dapat menggunakan test1.utf16count
string.count
.
Untuk Swift 2.0 dan 3.0, gunakan test1.characters.count
. Tapi, ada beberapa hal yang harus Anda ketahui. Jadi, baca terus.
Sebelum Swift 2.0, count
adalah fungsi global. Pada Swift 2.0, itu bisa disebut sebagai fungsi anggota.
test1.characters.count
Ini akan mengembalikan jumlah sebenarnya dari karakter Unicode dalam String
, jadi itu adalah alternatif yang paling benar dalam arti bahwa, jika Anda mencetak string dan menghitung karakter dengan tangan, Anda akan mendapatkan hasil yang sama.
Namun, karena cara Strings
ini diterapkan dalam Swift, karakter tidak selalu mengambil jumlah memori yang sama, jadi ketahuilah bahwa ini berperilaku sangat berbeda dari metode penghitungan karakter biasa dalam bahasa lain.
Misalnya, Anda juga bisa menggunakan test1.utf16.count
Tapi, seperti yang tertera di bawah ini, nilai yang dikembalikan tidak dijamin sama dengan yang menelepon count
pada characters
.
Dari referensi bahasa:
Cluster grapheme diperpanjang dapat terdiri dari satu atau lebih skalar Unicode. Ini berarti bahwa karakter yang berbeda — dan representasi berbeda dari karakter yang sama — dapat membutuhkan jumlah memori yang berbeda untuk disimpan. Karena itu, karakter dalam Swift tidak masing-masing mengambil jumlah memori yang sama dalam representasi string. Akibatnya, jumlah karakter dalam string tidak dapat dihitung tanpa iterasi melalui string untuk menentukan batas cluster grapheme yang diperluas. Jika Anda bekerja dengan nilai-nilai string yang sangat panjang, perlu diketahui bahwa properti karakter harus beralih di atas Unicode skalars di seluruh string untuk menentukan karakter untuk string itu.
Hitungan karakter yang dikembalikan oleh properti karakter tidak selalu sama dengan properti panjang NSString yang berisi karakter yang sama. Panjang NSString didasarkan pada jumlah unit kode 16-bit dalam representasi UTF-16 string dan bukan jumlah cluster grapheme Unicode diperpanjang dalam string.
Contoh yang menggambarkan dengan sempurna situasi yang dijelaskan di atas adalah memeriksa panjang string yang berisi karakter emoji tunggal, seperti yang ditunjukkan oleh n00neimp0rtant dalam komentar.
var emoji = "👍"
emoji.characters.count //returns 1
emoji.utf16.count //returns 2
countElements()
) mendapatkan jumlah karakter tepat dalam String. Mungkin berbeda dari apa yang Anda dapatkan dari memanggil [str length]
di Objective-C, karena length
metode ini mengasumsikan semua karakter dalam string terdiri dari unit kode 16-bit, sambil countElements()
mendapatkan jumlah aktual karakter Unicode. Namun, sebagian besar waktu dari semua alternatif di atas akan memberikan hasil yang sama, khususnya jika Anda menggunakan karakter umum bahasa Inggris.
Pembaruan Swift 1.2: Tidak ada lagi countElements untuk menghitung ukuran koleksi. Cukup gunakan fungsi hitung sebagai pengganti: hitung ("Swift")
Swift 2.0, 3.0 dan 3.1:
biarkan strLength = string.characters.count
Swift 4.2 (4.0 dan seterusnya): [Apple Documentation - Strings]
biarkan strLength = string.count
Swift 1.1
extension String {
var length: Int { return countElements(self) } //
}
Cepat 1.2
extension String {
var length: Int { return count(self) } //
}
Swift 2.0
extension String {
var length: Int { return characters.count } //
}
Cepat 4.2
extension String {
var length: Int { return self.count }
}
let str = "Hello"
let count = str.length // returns 5 (Int)
Cepat 4
"string".count
;)
Cepat 3
extension String {
var length: Int {
return self.characters.count
}
}
pemakaian
"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))
Jika Anda hanya mencoba melihat apakah string kosong atau tidak (memeriksa panjang 0), Swift menawarkan metode uji boolean sederhana pada String
myString.isEmpty
Sisi lain dari koin ini adalah orang-orang bertanya di ObjectiveC bagaimana cara menanyakan apakah string kosong di mana jawabannya adalah untuk memeriksa panjang 0:
tl; dr Jika Anda ingin panjang tipe String dalam hal jumlah karakter yang dapat dibaca manusia, gunakan countElements () . Jika Anda ingin mengetahui panjangnya jumlah kluster grapheme yang diperluas , gunakan endIndex . Baca terus untuk detailnya.
The String jenis diimplementasikan sebagai koleksi memerintahkan (yaitu, urutan) dari karakter Unicode, dan itu sesuai dengan CollectionType protokol, yang sesuai dengan _CollectionType protokol, yang merupakan jenis input yang diharapkan oleh countElements () . Oleh karena itu, countElements () dapat dipanggil, melewati tipe String , dan itu akan mengembalikan jumlah karakter.
Namun, dalam sesuai dengan CollectionType , yang pada gilirannya sesuai dengan _CollectionType , String juga menerapkan startIndex dan endIndex dihitung properti, yang benar-benar mewakili posisi indeks sebelum cluster karakter pertama, dan posisi indeks setelah cluster karakter terakhir, masing-masing . Jadi, dalam string "ABC", posisi indeks sebelum A adalah 0 dan setelah C adalah 3. Oleh karena itu, endIndex = 3, yang juga merupakan panjang dari string.
Jadi, endIndex dapat digunakan untuk mendapatkan panjang semua jenis String, lalu, kan?
Ya, tidak selalu ... Karakter Unicode sebenarnya adalah cluster grapheme yang diperluas , yang merupakan urutan dari satu atau lebih skalar Unicode yang digabungkan untuk membuat satu karakter yang dapat dibaca manusia.
let circledStar: Character = "\u{2606}\u{20DD}" // ☆⃝
circledStar adalah karakter tunggal yang terdiri dari U + 2606 (bintang putih), dan U + 20DD (lingkaran penutup yang menggabungkan). Mari kita membuat String dari circledStar dan membandingkan hasil countElements () dan endIndex .
let circledStarString = "\(circledStar)"
countElements(circledStarString) // 1
circledStarString.endIndex // 2
Berikut ini sesuatu yang lebih pendek, dan lebih alami daripada menggunakan fungsi global:
aString.utf16count
Saya tidak tahu apakah itu tersedia dalam versi beta 1. Tapi itu pasti ada di beta 2.
Diperbarui untuk Xcode 6 beta 4, ubah metode utf16count -> utf16Count
var test1: String = "Scott"
var length = test1.utf16Count
Atau
var test1: String = "Scott"
var length = test1.lengthOfBytesUsingEncoding(NSUTF16StringEncoding)
utf16count
akan salah
Pada Swift 1.2 utf16Count
telah dihapus. Anda sekarang harus menggunakan count()
fungsi global dan meneruskan tampilan string UTF16. Contoh di bawah ini ...
let string = "Some string"
count(string.utf16)
Untuk Xcode 7.3 dan Swift 2.2.
let str = "🐶"
Jika Anda ingin jumlah karakter visual:
str.characters.count
Jika Anda ingin "unit kode 16-bit dalam representasi UTF-16 string":
str.utf16.count
Sebagian besar waktu, 1 adalah apa yang Anda butuhkan.
Kapan Anda membutuhkan 2 ? Saya telah menemukan use case untuk 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
Jika Anda menggunakan 1 , hasilnya salah:
let result = regex.stringByReplacingMatchesInString(str,
options: NSMatchingOptions.WithTransparentBounds,
range: NSMakeRange(0, str.characters.count), withTemplate: "dog")
print(result) // dogdogdog🐶🐶🐶
Swift 2.0: Dapatkan penghitungan: yourString.text.characters.count
Contoh menyenangkan tentang bagaimana ini berguna adalah untuk menunjukkan hitung mundur karakter dari beberapa nomor (misalnya 150) dalam UITextView:
func textViewDidChange(textView: UITextView) {
yourStringLabel.text = String(150 - yourStringTextView.text.characters.count)
}
Di swift4 saya selalu menggunakan string.count
sampai hari ini saya telah menemukan itu
string.endIndex.encodedOffset
adalah substitusi yang lebih baik karena lebih cepat - untuk 50.000 karakter string adalah sekitar 6 kali lebih cepat daripada .count
. The .count
tergantung pada panjang string tetapi.endIndex.encodedOffset
tidak.
Tetapi ada satu TIDAK. Ini tidak baik untuk string dengan emoji, itu akan memberikan hasil yang salah, jadi hanya .count
benar.
Dalam Swift 4 : Jika string tidak mengandung karakter unicode, gunakan yang berikut ini
let str : String = "abcd"
let count = str.count // output 4
Jika string berisi karakter unicode maka gunakan berikut ini:
let spain = "España"
let count1 = spain.count // output 6
let count2 = spain.utf8.count // output 7
utf8.count
? Itu tidak memberikan hitungan karakter. Ini memberikan jumlah byte yang dibutuhkan untuk pengkodean string UTF-8.
Dalam Xcode 6.1.1
extension String {
var length : Int { return self.utf16Count }
}
Saya pikir para Jenius akan mengubah ini pada setiap versi minor.
Dapatkan nilai string dari tampilan teks atau bidang teks Anda:
let textlengthstring = (yourtextview?.text)! as String
Temukan jumlah karakter dalam string:
let numberOfChars = textlength.characters.count
Inilah yang akhirnya saya lakukan
let replacementTextAsDecimal = Double(string)
if string.characters.count > 0 &&
replacementTextAsDecimal == nil &&
replacementTextHasDecimalSeparator == nil {
return false
}
return true
kasing?). Bisakah Anda mengecek ulang dan, kalau-kalau, edit jawaban Anda? Terima kasih!
Pembaruan Swift 4 membandingkan dengan swift 3
Swift 4 menghilangkan kebutuhan akan array karakter pada String. Ini berarti bahwa Anda dapat langsung memanggil count
string tanpa terlebih dahulu mendapatkan karakter array.
"hello".count // 5
Sedangkan di swift 3, Anda harus mendapatkan karakter array dan kemudian menghitung elemen dalam array itu. Perhatikan bahwa metode berikut ini masih tersedia di swift 4.0 karena Anda masih dapat memanggil characters
untuk mengakses array karakter dari string yang diberikan
"hello".characters.count // 5
Swift 4.0 juga mengadopsi Unicode 9 dan sekarang dapat menginterpretasikan cluster grapheme. Misalnya, mengandalkan emoji akan memberi Anda 1 saat di swift 3.0, Anda mungkin mendapatkan jumlah lebih dari 1.
"👍🏽".count // Swift 4.0 prints 1, Swift 3.0 prints 2
"👨❤️💋👨".count // Swift 4.0 prints 1, Swift 3.0 prints 4
Anda bisa mendapatkan panjangnya hanya dengan menulis ekstensi:
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)
Ini menghitung karakter dalam String Swift Biasa
countElements((newString as String))
Ini menghitung karakter dalam NSString
test1.characters.count
akan memberi Anda jumlah huruf / angka dll di string Anda.
ex:
test1 = "StackOverflow"
print(test1.characters.count)
( mencetak " 13 ")
Apple membuatnya berbeda dari bahasa utama lainnya. Cara saat ini adalah menelepon:
test1.characters.count
Namun, untuk berhati-hati, ketika Anda mengatakan panjang Anda berarti jumlah karakter bukan jumlah byte, karena keduanya dapat berbeda ketika Anda menggunakan karakter non-ascii.
Sebagai contoh;
"你好啊hi".characters.count
akan memberi Anda 5 tetapi ini bukan hitungan byte. Untuk mendapatkan jumlah byte yang sebenarnya, Anda perlu melakukannya "你好啊hi".lengthOfBytes(using: String.Encoding.utf8)
. Ini akan memberi Anda 11.
Saat ini (dalam Swift 2.3) jika Anda menggunakan:
myString.characters.count
metode akan mengembalikan tipe "Jarak", jika Anda membutuhkan metode untuk mengembalikan Integer Anda harus mengetikkan cor seperti:
var count = myString.characters.count as Int
Distance
dari String.CharacterView
ini Int
, seharusnya tidak ada kebutuhan untuk cor ini.