String uzunluğunu əldə edin

Bir String uzunluğu necə əldə edə bilərsən? Məsələn, mənim kimi bir dəyişən var:

 var test1: String = "Scott" 

Buna baxmayaraq, simli uzunluq metodunu tapa bilmirəm.

719
04 июня '14 в 15:40 2014-06-04 15:40 Scott Walter 04 iyun 'da 15:40' də soruşdu . 2014-06-04 15:40
@ 45 cavab
  • 1
  • 2

Swift 4-dən başlayaraq

Sadədir:

 test1.count 

səbəblər üzündən.

(Martin R. sayəsində)

Swift 2 dən başlayaraq:

Swift 2 ilə, Apple qlobal funksiyaları protokol uzantıları, protokol uyğun hər hansı bir uyğun genişləndirilməsi dəyişdi. Beləliklə, yeni sintaksis:

 test1.characters.count 

(Tövsiyələr üçün JohnDifool sayəsində)

Swift 1-dən etibarən

Karakter sayma metodundan istifadə edin:

 let unusualMenagerie = "Koala  Snail  Penguin  Dromedary  println("unusualMenagerie has \(count(unusualMenagerie)) characters") // prints "unusualMenagerie has 40 characters" 

düz Apple Swift dərslərindən

(Qeyd edək ki, Swift-ın versiyaları 1.2-dən daha əvvəl, bunun əvəzinə countElements(unusualMenagerie) olacaq

Sizin dəyişəniniz olacaq

 length = count(test1) // was countElements in earlier versions of Swift 

Və ya test1.utf16count istifadə edə bilərsiniz

1174
04 июня '14 в 15:41 2014-06-04 15:41 Cavab milper tərəfindən verilir. 04 iyun '14 saat 15:41 2014-06-04 15:41

TL; DR:

Swift 2.0 və 3.0 üçün, test1.characters.count istifadə test1.characters.count . Ancaq bildiyiniz bir neçə şey var. Yəni oxuyun.

Swift Karakter sayı

Swift 2.0 əvvəl count funksiyası qlobal idi. Swift 2.0 ilə, üzv funksiyası deyilə bilər.

 test1.characters.count 

Stringdə Unicode simvollarının faktiki sayını qaytaracaqsınız, buna görə də bu bir simli yazın və simvolları əl ilə sayırsınızsa, eyni nəticəni əldə edəcəyin mənada bu ən doğru alternativdir.

Bununla belə, Strings Swift-də tətbiq edilən şəkildə, simvollar həmişə eyni məbləğdə işləməyəcək, buna görə də bu digər dillərdə simvolların sayılmasının adi üsullarından fərqli olaraq davranır.

border=0

Məsələn, test1.utf16.count istifadə edə bilərsiniz

Lakin, aşağıda qeyd edildiyi kimi, qaytarma dəyəri characters zəng etmək üçün eyni deyildir.

Dil bağlantısını istifadə edərək:

Genişləndirilmiş grapheme klasterləri bir və ya daha çox Unicode skalardan ibarət ola bilər. Bu fərqli simvollar və eyni xarakterli müxtəlif təsvirlər saxlaya biləcək müxtəlif məbləğdə yaddaş tələb edə bilər. Buna görə də, Swift-in simvolu hər bir simvolu təqdimatdakı eyni məbləğə qədər deyildir. Nəticədə, hər bir xətt üzrə simvolların sayı genişləndirilmiş üzüm qrupu sərhədlərini müəyyən etmək üçün xətt üzərində təkrarlanmadan hesablana bilməz. Xüsusən uzun bir string dəyərində işləyirsinizsə, bu simli simvolların simvollarını müəyyən etmək üçün xarakterik xüsusiyyətin Unicode tarayıcılarından keçməsi lazımdır.

Xarakterli əmlak tərəfindən qaytarılan simvolların sayı həmişə eyni simvolları olan NSString uzunluğu ilə eyni deyil. NSString uzunluğu, hər bir xətt üçün Unicode genişləndirilmiş grapheme qruplarının sayından çox deyil, UTF-16 təmsil stringsində 16 bit kod bloklarının sayına əsaslanır.

Yuxarıda təsvir olunan vəziyyəti mükəmməl şəkildə təsvir edən bir nümunə şərhdə n00neimp0rtant tərəfindən göstərilən bir emosiya xarakterli bir xəttin uzunluğunu yoxlamaqdır.

 var emoji = "👍" emoji.characters.count //returns 1 emoji.utf16.count //returns 2 
331
04 июня '14 в 15:41 2014-06-04 15:41 Cezar tərəfindən 04 iyun '14 'də saat 15.41' də cevap verildi. 2014-06-04 15:41

Swift 1.2 yeniləmə: countElements artıq koleksiyonların ölçüsünü hesablamaq üçün mövcud deyil. Əvəz olaraq hesablama funksiyasını istifadə edin: count ("Swift")

Swift 2.0, 3.0 və 3.1:

strLength = string.characters.count bildirilsin

Swift 4.2 (4.0): [Apple Sənədləri - Strings]

strLength = string.count bildirilsin

89
15 апр. Cavab San 15 Aprel verilir. 2015-04-15 05:08 '15 'də 5:08' də başlayan: 2015-04-15 05:08
 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 } extension String { var length: Int { return self.count } // Swift 4.2 } 
58
22 окт. cümə axşamı Whitneylandə cavab verildi . 2014-10-22 23:07 '14 saat 23:07 2014-10-22 23:07

Swift 4

"string".count

;)

Swift 3

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

İstifadə

"string".length

46
25 дек. Cavab Vyacheslav 25 dekabr. 2016-12-25 01:15 '16 'da 1:15 2016-12-25 01:15' də

Yalnız simli boş və ya yoxsa (0 uzunluğu yoxlanılır) yoxsa çalışırsa, Swift String üzərində sadə bir məntiqi test metodu təklif edir String

 myString.isEmpty 

Bu sikkənin digər tərəfi ObjectiveC-də xəttin boşluğunun olub-olmadığını xahiş etmək istəyən insanlar idi və cavab uzunluğu 0:

NSString boşdur

22
29 авг. Kendall Helmstetter Gelner tərəfindən verilmiş cavab 29 Avqust. 2014-08-29 22:54 '14 at 10:54 pm 2014-08-29 22:54

tl; dr Insan oxunaqlı simvolların sayı baxımından bir String uzunluğu ehtiyac varsa, countElements () istifadə edin. Uzunluqlu uzaqgörən qruplar sayının uzunluğunu bilmək istəyirsinizsə, endIndex istifadə edin . Daha ətraflı oxuyun.

Dize növü Unicode simvollarının sifarişli bir kolleksiyası (yəni sırası) kimi həyata keçirilir və countElements () tərəfindən gözlənilən giriş növü olan _CollectionType ilə uyğun gələn CollectionType protokoluna uyğun gəlir. Buna görə CountElements () deyə String növü keçərək zəng edə bilərsiniz və bu simvol sayını qaytarır.

Bununla belə, CollectionColourType-ə uyğun olaraq, _CollectionType-ə uyğun olaraq, String həmçinin startIndexendIndex-ni tətbiq edir , bu, həqiqətən, birinci xarakterli qrupun əvvəlki indeks mövqeyini və sonuncu xarakter qrupundan sonra index mövqeyini əks etdirir. Beləliklə, "ABC" xəttində A qarşısındakı indeks mövqeyi 0 və C-dən sonra 3 olur. Buna görə endIndex = 3, xəttin uzunluğu.

Belə endIndex hər hansı bir String uzunluğunu almaq üçün istifadə edilə bilər, və sonra?

Yaxşı, həmişə deyil ... Unicode simvolları bir və ya birdən çox Unicode skanerinin ardıcıllığı olan, bir simvolu ilə oxunaqlı bir şəxs yaratmaq üçün birləşdirilmiş birləşmə qruplarıdır.

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

circledStar U + 2606 (ağ ulduz) və U + 20DD (ətraf dairənin kombinasiyası) ibarət vahid bir simvoldur. CircledStar'dan String yaradın və countElements ()endIndex nəticələrini müqayisə edin.

 let circledStarString = "\(circledStar)" countElements(circledStarString) // 1 circledStarString.endIndex // 2 
17
30 авг. Scott Gardner tərəfindən verilmiş cavab 30 Avqust. 2014-08-30 14:06 '14 at 14:06 2014-08-30 14:06

Swift 2.0-da count artıq işləmir. Bunun əvəzinə istifadə edə bilərsiniz:

 var testString = "Scott" var length = testString.characters.count 
13
14 июня '15 в 15:30 2015-06-14 15:30 cavab Antoine tərəfindən 14 İyun '15 'də 15:30' də verildi. 2015-06-14 15:30

Burada qlobal funksiyadan daha qısa və daha təbii bir şey var:

 aString.utf16count 

Beta 1-də mövcud olub olmadığını bilmirəm. Lakin beta 2-də qətiliklə mövcuddur.

13
18 июня '14 в 23:13 2014-06-18 23:13 Cavab Jean Le Moignan tərəfindən 18 İyun 2014 tarixində 23:13 2014-06-18 23:13 tərəfindən verilir

Xcode 6 beta 4 üçün yeniləndi, dəyişdirmək üsulu utf16count → utf16Count

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

və ya

  var test1: String = "Scott" var length = test1.lengthOfBytesUsingEncoding(NSUTF16StringEncoding) 
9
22 июля '14 в 8:20 2014-07-22 08:20 Cavab Kiet Nguyen tərəfindən 22 İyul 2014 'da 8:20' də veriləcək 2014-07-22 08:20

Swift 1.2 ilə utf16Count silindi. İndi global count() funksiyasından istifadə etməlisiniz və simli UTF16 təqdimatını keçməlisiniz. Aşağıdakı nümunə ...

 let string = "Some string" count(string.utf16) 
9
25 февр. cavab 25 fevralda Jeremy Fox tərəfindən verilir . 2015-02-25 22:51 '15 at 10:51 pm 2015-02-25 22:51

Bunu belə edə bilərsiniz

 var test1: String = "Scott" var length = test1.bridgeToObjectiveC().length 
7
04 июня '14 в 15:41 2014-06-04 15:41 Cavab Anil Varghese tərəfindən 04 İyun '14 'də saat 15:41' də verildi. 2014-06-04 15:41

Xcode 7.3 və Swift 2.2 üçün.

 let str = "🐶" 

1) Vizual simvolların sayını istəyirsinizsə:

 str.characters.count // 1 

2) Əgər 16-bit code units within the string's UTF-16 representation istəsəniz:

 str.utf16.count // 2 



Çox hallarda 1) sizə lazım olanıdır.

2) nə vaxt lazımdır? 2) istifadə üçün bir halda tapdım:

 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) istifadə edərsə, nəticə səhvdir:

 let result = regex.stringByReplacingMatchesInString(str, options: NSMatchingOptions.WithTransparentBounds, range: NSMakeRange(0, str.characters.count), withTemplate: "dog") print(result) // dogdogdog🐶🐶🐶 
6
03 июля '16 в 13:41 2016-07-03 13:41 Cavab Tyler Uzun tərəfindən verilir 03 Iyul '13 , 13:41 2016-07-03 13:41

Swift 2.x bir simli uzunluğu necə tapmaq üçün göstərir.

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

24 qaytarır

5
27 дек. Cavab Adam 27 dekabrda verilir. 2015-12-27 18:02 '15 at 18:02 2015-12-27 18:02

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" 
4
04 авг. Cavab Saranjith 04 aug tərəfindən verilir . 2017-08-04 15:21 '17 at 3:21 pm 2017-08-04 15:21

Swift 2.0: Counter alın: yourString.text.characters.count

Bir UITextView-də müəyyən bir rəqəmdən (məsələn, 150) bir simvolun geri sayını göstərmək necə faydalı olacağının maraqlı bir nümunəsidir:

 func textViewDidChange(textView: UITextView) { yourStringLabel.text = String(150 - yourStringTextView.text.characters.count) } 
4
01 окт. cavab ccd 01 oktyabr verilir . 2015-10-01 09:52 '15 at 9:52 2015-10-01 09:52

Swift 4-də : simli Unicode xarakterli deyilsə, aşağıdakıları istifadə edin

 let str : String = "abcd" let count = str.count // output 4 

Simli Unicode karakterləri varsa, aşağıdakıları istifadə edin:

 let spain = "España" let count1 = spain.count // output 6 let count2 = spain.utf8.count // output 7 
3
09 дек. Cavab Ashis Laha 09 dekabr tərəfindən verilir . 2017-12-09 13:12 '17 saat 13:12 'də 2017-12-09 13:12

Swift4, mən həmişə string.count bu günə qədər aşkar etdik

 string.endIndex.encodedOffset 

bu ən yaxşı əvəzdir, çünki bu, daha sürətlidır - 50.000 simvol üçün simli təxminən 6 dəfə daha sürətli .count . .count string uzunluğundan asılıdır, lakin .endIndex.encodedOffset deyil.

Amma bir NO var. Bu emoji ilə xətləri üçün yaxşı deyil, səhv nəticə verəcəkdir, belə ki, yalnız .count düzgündür.

3
09 сент. Cavab VYT 09 Sentyabr verilir. 2018-09-09 16:05 '18 saat 16:05 'da 2018-09-09 16:05

Bunu etdiyim şey budur

 let replacementTextAsDecimal = Double(string) if string.characters.count > 0  replacementTextAsDecimal == nil  replacementTextHasDecimalSeparator == nil { return false } 
2
26 апр. Apr 26-da Bryan Clark tərəfindən verilmiş cavab 2017-04-26 01:01 '17 də 1:01 2017-04-26 01:01

Xcode 6.1.1-də

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

Mən brainiacs bu hər kiçik versiyası dəyişəcək düşünürəm.

2
12 марта '15 в 11:09 2015-03-12 11:09 cavab 12 mart, 12:00 'də verilir

Swift 4

 let str = "Your name" str.count 

Unutmayın: yer sayı da sayılır

2
13 нояб. Cavab, cənab Şin tərəfindən noyabrın 13-də verilir . 2017-11-13 20:57 '17 saat 20:57 'da 2017-11-13 20:57

Siz sadəcə uzantıyı yazaraq uzunluğu əldə edə bilərsiniz:

 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 } } 
2
16 янв. Cavab Riajur Rahman tərəfindən 16 Yanvar verildi 2018-01-16 08:33 '18 saat 8:33 'da 2018-01-16 08:33

Bir mətn sahəsindən və ya mətn sahəsindən dize dəyərini alın:

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

Simli simvolların sayını tapın:

 let numberOfChars = textlength.characters.count 
2
22 дек. Cavab kalyan711987 22 dekabr verilir . 2016-12-22 11:01 '16 'da 11:01' də 2016-12-22 11:01 'də

Hal hazırda (Swift 2.3-də), istifadə etdiyiniz zaman:

 myString.characters.count 

üsulu, "Geri qayıt" tipini qaytarır, belə bir şəkildə qaytarılması üçün bir üsula ehtiyacınız varsa, aşağıdakı kimi yazmalısınız:

 var count = myString.characters.count as Int 
1
31 авг. Cavab Jesse tərəfindən 31 avqustda verilir. 2016-08-31 22:15 '16 saat 10:15 'da 2016-08-31 22:15

Swift 4 - Fast 3-in təkmilləşdirilməsi

Swift 4 String bir simvol sıra ehtiyacını aradan qaldırır. Bu, ilk növbədə, simvolların bir sıra əldə etmədən birbaşa bir simvoda count bilərsiniz.

 "hello".count // 5 

Sürətli 3-də bir sıra simvol almaq lazımdır və sonra bu ardıcıl elementi saymaq lazımdır. Bu simvolun xarakterli arrayinə daxil olmaq üçün hələ də characters axtarış edə biləcəyiniz üçün bu növbəti üsul hələ swift 4.0-də mövcuddur.

 "hello".characters.count // 5 

Swift 4.0 da Unicode 9 istifadə edir və indi grapheme qruplarını şərh edə bilər. Məsələn, emos sayılması 1 verəcək, sürətlə 3.0 isə 1dən böyük miqdarda əldə edə bilərsiniz.

 "👍🏽".count // Swift 4.0 prints 1, Swift 3.0 prints 2 "👨‍❤️‍💋‍👨".count // Swift 4.0 prints 1, Swift 3.0 prints 4 
1
12 июля '17 в 7:00 2017-07-12 07:00 cavab 12 İyul, '17 'də 7:00' də 2017-07-12 07:00 'də verilir

Apple digər əsas dillərdən fərqli idi. Mövcud üsul zəng etməkdir:

test1.characters.count

Uzunluğu söyləyərkən ehtiyatlı olmaq üçün, baytların sayını deyil, simvolların sayını deməkdir, çünki bu ikisi ascii xaricində simvol istifadə edərkən fərqlənə bilər.

Məsələn; "你好啊hi".characters.count sizə 5 verir, ancaq bu bayt sayı deyil. "你好啊hi".lengthOfBytes(using: String.Encoding.utf8) faktiki sayını almaq üçün, "你好啊hi".lengthOfBytes(using: String.Encoding.utf8) . Bu sizə verəcək 11.

1
28 авг. cavab Frank 28 avqustda verilir . 2016-08-28 23:18 '16 'da saat 11:18' da 2016-08-28 23:18

Swift'ta bir String saymanın ən yaxşı yolu:

 var str = "Hello World" var length = count(str.utf16) 
1
13 апр. Cavab Zaldy 13 apr verilir . 2015-04-13 13:14 '15 'də 13:14' de 2015-04-13 13:14

sürətli bir 3/4 mənim üçün iki qəpik

Əgər şərti tərtib etmək lazımdır

  #if swift(>=4.0) let len = text.count #else let len = text.characters.count #endif 
1
24 авг. Cavab verilir ingongti 24 aug. 2017-08-24 00:56 '17 'də 0:56 2017-08-24 00:56' də
 var str = "Hello, playground" var newString = str as NSString countElements(str) 

Normal simli simli simvol sayar.

 countElements((newString as String)) 

NSString-də simvol sayılır

1
13 окт. brokenrhino tərəfindən verilmiş cavab oktyabr 13 2014-10-13 19:08 '14 at 19:08 2014-10-13 19:08

String və NSString pulsuz körpüdür, belə ki, bütün mövcud NSString üsullarını String ilə istifadə edə bilərsiniz

 let x = "test" as NSString let y : NSString = "string 2" let lenx = x.count let leny = y.count 
1
19 июня '15 в 18:51 2015-06-19 18:51 Cavab Tyan Dinh tərəfindən 19 iyun 'da 18:51' də verilir. 2015-06-19 18:51
  • 1
  • 2

Tags bağlı digər suallar və ya bir sual