swift - आखर - सीआईडी एपिसोड 664




एक स्ट्रिंग की लंबाई प्राप्त करें (20)

आप String की लंबाई कैसे प्राप्त करते हैं? उदाहरण के लिए, मेरे पास एक चर परिभाषित है:

var test1: String = "Scott"

हालांकि, मुझे स्ट्रिंग पर लम्बाई विधि नहीं मिल रही है।


TLDR:

स्विफ्ट 2.0 और 3.0 के लिए, test1.characters.count उपयोग test1.characters.count । लेकिन, कुछ चीजें आपको जाननी चाहिए। तो, पढ़ें।

स्विफ्ट में वर्णों की गणना

स्विफ्ट 2.0 से पहले, count एक वैश्विक कार्य था। स्विफ्ट 2.0 के रूप में, इसे सदस्य फ़ंक्शन के रूप में बुलाया जा सकता है।

test1.characters.count

यह String में यूनिकोड वर्णों की वास्तविक संख्या को वापस कर देगा, इसलिए यह अर्थ में सबसे सही विकल्प है कि, यदि आप स्ट्रिंग मुद्रित करेंगे और हाथों से वर्णों की गणना करेंगे, तो आपको वही परिणाम मिल जाएगा।

हालांकि, स्विफ्ट में Strings को लागू करने के तरीके के कारण, वर्ण हमेशा स्मृति की मात्रा नहीं लेते हैं, इसलिए ध्यान रखें कि यह अन्य भाषाओं में सामान्य चरित्र गणना विधियों की तुलना में काफी अलग व्यवहार करता है।

उदाहरण के लिए, आप test1.utf16.count भी उपयोग कर सकते हैं

लेकिन, जैसा कि नीचे बताया गया है, लौटाया गया मूल्य characters पर कॉलिंग count के समान नहीं है।

भाषा संदर्भ से:

विस्तारित ग्रैफेम क्लस्टर एक या अधिक यूनिकोड स्केलर से बना सकते हैं। इसका मतलब है कि अलग-अलग वर्ण-और एक ही चरित्र के विभिन्न प्रतिनिधित्व-स्टोर करने के लिए स्मृति की विभिन्न मात्रा की आवश्यकता हो सकती है। इस वजह से, स्विफ्ट में वर्ण प्रत्येक स्ट्रिंग के प्रतिनिधित्व के भीतर समान मात्रा में स्मृति नहीं लेते हैं। नतीजतन, एक स्ट्रिंग में वर्णों की संख्या को इसकी विस्तारित ग्रैफेम क्लस्टर सीमाओं को निर्धारित करने के लिए स्ट्रिंग के माध्यम से पुनरावृत्त किए बिना गणना नहीं की जा सकती है। यदि आप विशेष रूप से लंबे स्ट्रिंग मानों के साथ काम कर रहे हैं, तो ध्यान रखें कि उस स्ट्रिंग के वर्णों को निर्धारित करने के लिए अक्षरों की संपत्ति को संपूर्ण स्ट्रिंग में यूनिकोड स्केलर पर फिर से चालू करना होगा।

पात्रों की संपत्ति द्वारा लौटाए गए वर्णों की गिनती हमेशा एक एनएसएसटींग की लंबाई संपत्ति के समान नहीं होती है जिसमें समान वर्ण होते हैं। एनएसएसटींग की लंबाई स्ट्रिंग के यूटीएफ -16 प्रतिनिधित्व के भीतर 16-बिट कोड इकाइयों की संख्या पर आधारित है और स्ट्रिंग के भीतर यूनिकोड विस्तारित ग्रैफेम क्लस्टर की संख्या नहीं है।

एक उदाहरण जो ऊपर वर्णित स्थिति को पूरी तरह से चित्रित करता है वह है कि एक एकल इमोजी चरित्र वाली एक स्ट्रिंग की लंबाई की जांच करना, जैसा टिप्पणियों में n00neimp0rtant द्वारा n00neimp0rtant किया गया है।

var emoji = "👍"
emoji.characters.count             //returns 1
emoji.utf16.count                  //returns 2

स्विफ्ट 4.0

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"

अपने टेक्स्टव्यू या टेक्स्टफील्ड से स्ट्रिंग मान प्राप्त करें:

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

स्ट्रिंग में वर्णों की गिनती पाएं:

let numberOfChars = textlength.characters.count

आप इस तरह कोशिश कर सकते हैं

var test1: String = "Scott"
var length =  test1.bridgeToObjectiveC().length

एक्सकोड 6 बीटा 4 के लिए अपडेट किया गया, विधि utf16count -> utf16Count बदलें

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

या

 var test1: String = "Scott"
 var length = test1.lengthOfBytesUsingEncoding(NSUTF16StringEncoding)

एक्सकोड 6.1.1 में

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

मुझे लगता है कि दिमागी हर छोटे संस्करण पर इसे बदल देगा।


ऐप्पल ने इसे अन्य प्रमुख भाषा से अलग बना दिया। वर्तमान तरीका कॉल करना है:

test1.characters.count

हालांकि, सावधान रहना, जब आप लंबाई कहें तो आपका मतलब है कि अक्षरों की गिनती बाइट्स की गिनती नहीं है, क्योंकि जब आप गैर-असीसी वर्णों का उपयोग करते हैं तो वे दोनों भिन्न हो सकते हैं।

उदाहरण के लिए; "你好啊hi".characters.count आपको 5 देगा लेकिन यह बाइट्स की गिनती नहीं है। बाइट्स की असली गिनती प्राप्त करने के लिए, आपको "你好啊hi".lengthOfBytes(using: String.Encoding.utf8) । यह आपको 11 देगा।


तेजी से 3/4 के लिए मेरे दो सेंट

यदि आपको सशर्त रूप से संकलित करने की आवश्यकता है

    #if swift(>=4.0)
            let len = text.count
        #else
            let len = text.characters.count
        #endif

यहां मैं क्या कर रहा हूं

let replacementTextAsDecimal = Double(string)

if string.characters.count > 0 &&
    replacementTextAsDecimal == nil &&
    replacementTextHasDecimalSeparator == nil {
        return false
}

वैश्विक कार्य का उपयोग करने से यहां कुछ छोटा और अधिक प्राकृतिक है:

aString.utf16count

मुझे नहीं पता कि यह बीटा 1 में उपलब्ध है या नहीं। लेकिन यह निश्चित रूप से बीटा 2 में है।


स्विफ्ट 1.2 utf16Count रूप में हटा दिया गया है। अब आपको वैश्विक count() फ़ंक्शन का उपयोग करना चाहिए और स्ट्रिंग के UTF16 व्यू को पास करना चाहिए। नीचे उदाहरण ...

let string = "Some string"
count(string.utf16)

स्विफ्ट 2.0 count अब और काम नहीं करता है। आप इसके बजाय इसका उपयोग कर सकते हैं:

var testString = "Scott"
var length = testString.characters.count

स्विफ्ट 2.x में निम्नलिखित स्ट्रिंग की लंबाई को कैसे ढूंढें

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

24 लौटाता है


स्विफ्ट 4

let str =  "Your name"

str.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

स्विफ्ट 1.2 अपडेट: संग्रह के आकार की गणना करने के लिए अब कोई गिनती नहीं है। प्रतिबिंब के रूप में गिनती फ़ंक्शन का उपयोग करें: गिनती करें ("स्विफ्ट")

स्विफ्ट 2.0, 3.0 और 3.1:

strLength = string.characters.count दें

स्विफ्ट 4.0: [ऐप्पल दस्तावेज़ीकरण - स्ट्रिंग्स]

strLength = string.count दें


स्विफ्ट 4 अपडेट की तुलना में स्विफ्ट 4 अपडेट

स्विफ्ट 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

स्विफ्ट 4 के रूप में

आगामी स्विफ्ट 4 के साथ, यह सिर्फ होगा:

test1.count

कारणों से।

(मार्टिन आर के लिए धन्यवाद)

स्विफ्ट 2 के रूप में:

स्विफ्ट 2 के साथ, ऐप्पल ने वैश्विक कार्यों को प्रोटोकॉल एक्सटेंशन में बदल दिया है, एक्सटेंशन जो प्रोटोकॉल के अनुरूप किसी भी प्रकार से मेल खाते हैं। इस प्रकार नया वाक्यविन्यास है:

test1.characters.count

(सिर के लिए जॉनडिफूल के लिए धन्यवाद)

स्विफ्ट 1 के रूप में

गिनती वर्ण विधि का प्रयोग करें:

let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
println("unusualMenagerie has \(count(unusualMenagerie)) characters")
// prints "unusualMenagerie has 40 characters"

ऐप्पल स्विफ्ट गाइड से ठीक है

(नोट, 1.2 से पहले स्विफ्ट के संस्करणों के लिए, यह countElements(unusualMenagerie) होगी countElements(unusualMenagerie) इसके बजाय)

आपके चर के लिए, यह होगा

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

या आप test1.utf16count का उपयोग कर सकते हैं


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
}

test1.characters.count

आपको आपकी स्ट्रिंग में अक्षर / संख्या आदि की संख्या मिल जाएगी।

उदाहरण के लिए:

test1 = ""

print(test1.characters.count)

( प्रिंट " 13 ")








string