आप एक की लंबाई कैसे प्राप्त करते हैं String
? उदाहरण के लिए, मेरे पास एक वैरिएबल परिभाषित है जैसे:
var test1: String = "Scott"
हालाँकि, मैं स्ट्रिंग पर एक लंबाई विधि नहीं ढूँढ सकता।
आप एक की लंबाई कैसे प्राप्त करते हैं String
? उदाहरण के लिए, मेरे पास एक वैरिएबल परिभाषित है जैसे:
var test1: String = "Scott"
हालाँकि, मैं स्ट्रिंग पर एक लंबाई विधि नहीं ढूँढ सकता।
जवाबों:
स्विफ्ट 4+ के रूप में
यह सिर्फ है:
test1.count
कारणों से।
(मार्टिन आर के लिए धन्यवाद)
स्विफ्ट 2 के रूप में:
स्विफ्ट 2 के साथ, ऐप्पल ने वैश्विक कार्यों को प्रोटोकॉल एक्सटेंशन, एक्सटेंशन में बदल दिया है जो किसी भी प्रकार के प्रोटोकॉल के अनुरूप है। इस प्रकार नया सिंटैक्स है:
test1.characters.count
(सिर के लिए JohnDifool के लिए धन्यवाद)
स्विफ्ट 1 के रूप में
गणना वर्ण विधि का उपयोग करें:
let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
println("unusualMenagerie has \(count(unusualMenagerie)) characters")
// prints "unusualMenagerie has 40 characters"
Apple स्विफ्ट गाइड से सही है
(ध्यान दें, 1.2 से पहले के स्विफ्ट के संस्करणों के लिए, यह countElements(unusualMenagerie)
इसके बजाय होगा )
आपके चर के लिए, यह होगा
length = count(test1) // was countElements in earlier versions of Swift
या आप test1.utf16count का उपयोग कर सकते हैं
string.count
।
के लिए स्विफ्ट 2.0 और 3.0, उपयोग test1.characters.count
। लेकिन, कुछ चीजें हैं जिन्हें आपको जानना चाहिए। तो, पर पढ़ें।
स्विफ्ट 2.0 से पहले, count
एक वैश्विक समारोह था। स्विफ्ट 2.0 के रूप में, इसे एक सदस्य फ़ंक्शन के रूप में कहा जा सकता है।
test1.characters.count
यह यूनिकोड वर्णों की वास्तविक संख्या को वापस कर देगा String
, इसलिए यह इस अर्थ में सबसे सही विकल्प है कि, यदि आप स्ट्रिंग को प्रिंट करेंगे और वर्णों को हाथ से गिनेंगे, तो आपको वही परिणाम मिलेगा।
हालाँकि, Strings
स्विफ्ट में जिस तरह से कार्यान्वित किया जाता है, वर्ण हमेशा एक ही मात्रा में मेमोरी नहीं लेते हैं, इसलिए ध्यान रखें कि यह अन्य भाषाओं में सामान्य वर्ण गणना विधियों की तुलना में काफी भिन्न है।
उदाहरण के लिए, आप भी उपयोग कर सकते हैं test1.utf16.count
लेकिन, जैसा कि नीचे वर्णित है, दिए गए मान बुला के समान होने की गारंटी नहीं है count
पर characters
।
भाषा संदर्भ से:
विस्तारित अंगूर के गुच्छे एक या अधिक यूनिकोड स्केलर से बने हो सकते हैं। इसका मतलब है कि अलग-अलग वर्णों और एक ही चरित्र के अलग-अलग अभ्यावेदन - को स्टोर करने के लिए अलग-अलग मात्रा में मेमोरी की आवश्यकता हो सकती है। इस वजह से, स्विफ्ट में पात्र एक स्ट्रिंग के प्रतिनिधित्व के भीतर एक ही मात्रा में मेमोरी नहीं लेते हैं। नतीजतन, एक स्ट्रिंग में वर्णों की संख्या की गणना स्ट्रिंग के माध्यम से पुनरावृत्त किए बिना नहीं की जा सकती है ताकि इसकी विस्तारित ग्रैफेम क्लस्टर सीमाओं को निर्धारित किया जा सके। यदि आप विशेष रूप से लंबे स्ट्रिंग मानों के साथ काम कर रहे हैं, तो ध्यान रखें कि उस स्ट्रिंग के लिए वर्णों को निर्धारित करने के लिए पूरे स्ट्रिंग में यूनिकोड स्केलर्स पर वर्ण गुण को पुन: दर्ज करना होगा।
वर्ण गुण द्वारा लौटाए गए वर्णों की गणना हमेशा एक NSString की लंबाई गुण के समान नहीं होती है जिसमें समान वर्ण होते हैं। NSString की लंबाई स्ट्रिंग के UTF-16 प्रतिनिधित्व के भीतर 16-बिट कोड इकाइयों की संख्या पर आधारित होती है, न कि स्ट्रिंग के भीतर यूनिकोड विस्तारित ग्रैफेम क्लस्टर की संख्या।
एक उदाहरण जो ऊपर वर्णित स्थिति को पूरी तरह से दिखाता है, वह है एक एकल इमोजी चरित्र वाले स्ट्रिंग की लंबाई की जांच करना, जैसा कि टिप्पणियों में n00neimp0rtant द्वारा बताया गया है ।
var emoji = "👍"
emoji.characters.count //returns 1
emoji.utf16.count //returns 2
countElements()
) स्ट्रिंग में वर्णों की सटीक संख्या प्राप्त करता है। यह [str length]
ऑब्जेक्ट-सी में कॉल करने से आपको अलग होगा , क्योंकि length
विधि मानती है कि स्ट्रिंग के सभी वर्ण 16-बिट कोड इकाइयों से बने होते हैं, जबकि countElements()
यूनिकोड वर्णों की वास्तविक संख्या प्राप्त होती है। हालांकि, ऊपर दिए गए विकल्पों में से अधिकांश उसी समय वापस आएंगे, खासकर यदि आप अंग्रेजी भाषा के सामान्य पात्रों के साथ काम कर रहे हों।
स्विफ्ट 1.2 अपडेट: संग्रह का आकार गिनने के लिए अब कोई गणना नहीं है। प्रतिस्थापन के रूप में गणना फ़ंक्शन का उपयोग करें: गणना ("स्विफ्ट")
स्विफ्ट 2.0, 3.0 और 3.1:
Let strLength = string.characters.count
स्विफ्ट 4.2 (4.0 आगे): [Apple प्रलेखन - स्ट्रिंग्स]
Let 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 की लंबाई के लिए जाँच कर रहा है), स्विफ्ट एक साधारण बूलर परीक्षण परीक्षण प्रदान करता है String
myString.isEmpty
इस सिक्के का दूसरा पहलू ऑब्जेक्टिव में लोग पूछ रहे थे कि कैसे पूछा जाए कि क्या एक स्ट्रिंग खाली थी जहां उत्तर 0 की लंबाई के लिए जांचना था:
tl; dr यदि आप मानव-पठनीय वर्णों की संख्या के संदर्भ में स्ट्रिंग प्रकार की लंबाई चाहते हैं, तो countElements () का उपयोग करें । यदि आप विस्तारित अंगूर समूहों की संख्या के संदर्भ में लंबाई जानना चाहते हैं , तो एंडइंडेक्स का उपयोग करें । जानकारी के लिए आगे पढ़ें।
स्ट्रिंग प्रकार एक आदेश दिया संग्रह यूनिकोड वर्ण का (यानी, अनुक्रम) के रूप में कार्यान्वित किया जाता है, और यह के अनुरूप CollectionType प्रोटोकॉल, जो करने के लिए अनुरूप _CollectionType प्रोटोकॉल है, जो इनपुट से उम्मीद प्रकार है countElements () । इसलिए, countElements () , कहा जा सकता है एक गुजर स्ट्रिंग प्रकार , और यह वर्णों की गिनती लौटाएगा।
हालांकि, के अनुरूप में CollectionType है, जो करने के लिए बारी अनुरूप में _CollectionType , स्ट्रिंग भी लागू करता STARTINDEX और ENDINDEX अभिकलन गुण है, जो वास्तव सूचकांक की स्थिति का प्रतिनिधित्व करने से पहले पहले वर्ण क्लस्टर, और सूचकांक की स्थिति के बाद क्रमश: अंतिम वर्ण क्लस्टर, । तो, स्ट्रिंग "एबीसी" में, ए के पहले सूचकांक की स्थिति 0 है और सी के बाद 3. इसलिए, एंडइंडेक्स = 3, जो स्ट्रिंग की लंबाई भी है।
तो, एंडइंडेक्स का उपयोग किसी भी स्ट्रिंग प्रकार की लंबाई प्राप्त करने के लिए किया जा सकता है, फिर, सही?
खैर, हमेशा नहीं ... यूनिकोड के चरित्र वास्तव में ग्रैफेम क्लस्टर हैं , जो एक मानव-पठनीय चरित्र बनाने के लिए संयुक्त या एक से अधिक यूनिकोड स्केल के अनुक्रम हैं ।
let circledStar: Character = "\u{2606}\u{20DD}" // ☆⃝
circledStar एक एकल वर्ण है जो U + 2606 (एक सफ़ेद तारा), और U + 20DD (एक संयोजन घेरा) से बना है। चलिए circledStar से एक स्ट्रिंग बनाते हैं और countElements () और endIndex के परिणामों की तुलना करते हैं ।
let circledStarString = "\(circledStar)"
countElements(circledStarString) // 1
circledStarString.endIndex // 2
वैश्विक फ़ंक्शन का उपयोग करने की तुलना में यहां कुछ छोटा और अधिक प्राकृतिक है:
aString.utf16count
मुझे नहीं पता कि यह बीटा 1 में उपलब्ध है, हालाँकि। लेकिन यह निश्चित रूप से बीटा 2 में है।
Xcode 6 बीटा 4 के लिए अपडेट किया गया, परिवर्तन विधि utf16count -> utf16Count
var test1: String = "Scott"
var length = test1.utf16Count
या
var test1: String = "Scott"
var length = test1.lengthOfBytesUsingEncoding(NSUTF16StringEncoding)
utf16count
गलत होगा
स्विफ्ट 1.2 के utf16Count
रूप में हटा दिया गया है। अब आपको वैश्विक count()
फ़ंक्शन का उपयोग करना चाहिए और स्ट्रिंग के UTF16 दृश्य को पास करना चाहिए । नीचे उदाहरण ...
let string = "Some string"
count(string.utf16)
Xcode 7.3 और स्विफ्ट 2.2 के लिए।
let str = "🐶"
यदि आप दृश्य वर्णों की संख्या चाहते हैं:
str.characters.count
यदि आप "स्ट्रिंग के UTF-16 प्रतिनिधित्व के भीतर 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🐶🐶🐶
स्विफ्ट 2.0: एक गिनती प्राप्त करें: yourString.text.characters.count
UITextView में कुछ संख्या (उदाहरण के लिए 150) से वर्ण गणना दिखाने के लिए यह कितना उपयोगी होगा, इसका मजेदार उदाहरण:
func textViewDidChange(textView: UITextView) {
yourStringLabel.text = String(150 - yourStringTextView.text.characters.count)
}
स्विफ्ट 4 में मैंने हमेशा string.count
आज तक उपयोग किया है जो मैंने पाया है
string.endIndex.encodedOffset
बेहतर प्रतिस्थापन है क्योंकि यह तेज है - 50 000 वर्णों के लिए स्ट्रिंग 6 बार की तुलना में तेज है .count
। .count
स्ट्रिंग की लंबाई पर निर्भर करता है लेकिन .endIndex.encodedOffset
ऐसा नहीं करता।
लेकिन एक नहीं है। यह इमोजीस के साथ तार के लिए अच्छा नहीं है, यह गलत परिणाम देगा, इसलिए केवल .count
सही है।
में स्विफ्ट 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
utf8.count
? यह वर्णों की गिनती नहीं देता है। यह स्ट्रिंग के UTF-8 एन्कोडिंग के लिए आवश्यक बाइट्स की संख्या देता है।
Xcode में 6.1.1
extension String {
var length : Int { return self.utf16Count }
}
मुझे लगता है कि ब्रेनियाक्स हर मामूली संस्करण पर इसे बदल देगा।
अपने टेक्स्टव्यू या टेक्स्टफील्ड से स्ट्रिंग मान प्राप्त करें:
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
मामला नहीं होना चाहिए ?)। क्या आप कृपया अपना उत्तर संपादित कर सकते हैं और मामले में दोहरी जांच कर सकते हैं ? धन्यवाद!
स्विफ्ट 4 की तुलना स्विफ्ट 3 से की जा रही है
स्विफ्ट 4 स्ट्रिंग पर एक वर्ण सरणी की आवश्यकता को हटा देता है। इसका मतलब है कि आप count
पहले वर्ण सरणी प्राप्त किए बिना सीधे स्ट्रिंग पर कॉल कर सकते हैं ।
"hello".count // 5
जबकि स्विफ्ट 3 में, आपको वर्ण सरणी प्राप्त करनी होगी और फिर उस सरणी में तत्व को गिनना होगा। ध्यान दें कि यह निम्नलिखित विधि अभी भी तेजी से 4.0 में उपलब्ध है क्योंकि आप अभी भी characters
दिए गए स्ट्रिंग के वर्ण सरणी तक पहुंचने के लिए कॉल कर सकते हैं
"hello".characters.count // 5
स्विफ्ट 4.0 भी यूनिकोड 9 को गोद लेती है और यह अब ग्रैफेम क्लस्टर की व्याख्या कर सकती है। उदाहरण के लिए, इमोजी पर गिने जाने से आपको स्विफ्ट 3.0 में 1 जबकि आपको 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)
यह नियमित स्विफ्ट स्ट्रिंग में पात्रों को गिनता है
countElements((newString as String))
यह एक NSString में वर्णों को गिनता है
स्ट्रिंग और एनएसएसट्रिंग टोल फ्री ब्रिज हैं, ताकि आप स्विफ्ट स्ट्रिंग के साथ एनएसएसटीरिंग के लिए उपलब्ध सभी तरीकों का उपयोग कर सकें
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
हालाँकि, सावधान रहने के लिए, जब आप लंबाई कहते हैं, तो इसका मतलब है कि अक्षरों की गिनती बाइट्स की गिनती नहीं है, क्योंकि जब आप गैर-अस्सी वर्णों का उपयोग करते हैं तो वे दोनों अलग हो सकते हैं।
उदाहरण के लिए;
"你好啊hi".characters.count
आपको 5 देगा लेकिन यह बाइट्स की गिनती नहीं है। बाइट्स की वास्तविक गिनती प्राप्त करने के लिए, आपको करने की आवश्यकता है "你好啊hi".lengthOfBytes(using: String.Encoding.utf8)
। यह आपको 11 देगा।
अभी (स्विफ्ट 2.3 में) यदि आप उपयोग करते हैं:
myString.characters.count
विधि एक "दूरी" प्रकार लौटाएगी, यदि आपको एक इंटीजर को वापस करने के लिए विधि की आवश्यकता है तो आपको इस तरह कास्ट करना चाहिए:
var count = myString.characters.count as Int
Distance
की String.CharacterView
है Int
, इस कलाकारों की कोई आवश्यकता नहीं होना चाहिए।