सभी निम्नलिखित उदाहरणों का उपयोग करते हैं
var str = "Hello, playground"
startIndex
तथा endIndex
startIndex
पहले चरित्र का सूचकांक है
endIndex
अंतिम वर्ण के बाद का सूचकांक है ।
उदाहरण
// character
str[str.startIndex] // H
str[str.endIndex] // error: after last character
// range
let range = str.startIndex..<str.endIndex
str[range] // "Hello, playground"
स्विफ्ट 4 की एक तरफा सीमाओं के साथ , सीमा को निम्न रूपों में से एक में सरल बनाया जा सकता है।
let range = str.startIndex...
let range = ..<str.endIndex
मैं स्पष्टता के लिए निम्नलिखित उदाहरणों में पूर्ण फ़ॉर्म का उपयोग करूंगा, लेकिन पठनीयता के लिए, आप संभवतः अपने कोड में एक तरफा श्रेणियों का उपयोग करना चाहेंगे।
after
जैसे की: index(after: String.Index)
after
दिए गए सूचकांक के बाद सीधे चरित्र के सूचकांक को संदर्भित करता है।
उदाहरण
// character
let index = str.index(after: str.startIndex)
str[index] // "e"
// range
let range = str.index(after: str.startIndex)..<str.endIndex
str[range] // "ello, playground"
before
जैसे की: index(before: String.Index)
before
दिए गए सूचकांक से पहले सीधे चरित्र के सूचकांक को संदर्भित करता है।
उदाहरण
// character
let index = str.index(before: str.endIndex)
str[index] // d
// range
let range = str.startIndex..<str.index(before: str.endIndex)
str[range] // Hello, playgroun
offsetBy
जैसे की: index(String.Index, offsetBy: String.IndexDistance)
offsetBy
मूल्य सकारात्मक या नकारात्मक और दिए गए इंडेक्स से शुरू होता है हो सकता है। यद्यपि यह प्रकार का है String.IndexDistance
, आप इसे दे सकते हैं Int
।
उदाहरण
// character
let index = str.index(str.startIndex, offsetBy: 7)
str[index] // p
// range
let start = str.index(str.startIndex, offsetBy: 7)
let end = str.index(str.endIndex, offsetBy: -6)
let range = start..<end
str[range] // play
limitedBy
जैसे की: index(String.Index, offsetBy: String.IndexDistance, limitedBy: String.Index)
- यह
limitedBy
सुनिश्चित करने के लिए उपयोगी है कि ऑफसेट सूचकांक को सीमा से बाहर जाने का कारण नहीं बनता है। यह एक बाउंडिंग इंडेक्स है। चूंकि ऑफसेट के लिए सीमा से अधिक होना संभव है, इसलिए यह विधि एक वैकल्पिक रिटर्न देती है। nil
यदि सूचकांक सीमा से बाहर है तो यह वापस आ जाता है।
उदाहरण
// character
if let index = str.index(str.startIndex, offsetBy: 7, limitedBy: str.endIndex) {
str[index] // p
}
अगर 77
इसके बजाय ऑफसेट होता 7
, तो if
बयान को छोड़ दिया जाता।
String.Index की आवश्यकता क्यों है?
स्ट्रिंग्स के लिए एक सूचकांक का उपयोग करना बहुत आसान होगा Int
। String.Index
हर स्ट्रिंग के लिए एक नया बनाने का कारण यह है कि स्विफ्ट में वर्ण हूड के नीचे सभी समान लंबाई नहीं हैं। एक एकल स्विफ्ट चरित्र एक, दो या अधिक यूनिकोड कोड बिंदुओं से बना हो सकता है। इस प्रकार प्रत्येक अद्वितीय स्ट्रिंग को अपने वर्णों के अनुक्रमित की गणना करनी चाहिए।
संभवत: इस जटिलता को एक इंट इंडेक्स एक्सटेंशन के पीछे छिपाना है, लेकिन मैं ऐसा करने के लिए अनिच्छुक हूं। यह याद दिलाना अच्छा है कि वास्तव में क्या हो रहा है।
startIndex
0 से कुछ और क्यों होगा ?