2014-10-29 7 views
7

मुझे यकीन नहीं है कि यह एक्सकोड में एक बग है या मैं स्विफ्ट में श्रेणियों को समझ नहीं पाया। यह दिखाने के लिए यहां कुछ कोड दिया गया है कि श्रेणी कैसे काम करती है:स्विफ्ट में श्रेणियों की तुलना कैसे करें?

let range = 0..<5 
contains(range, 0) // true 
contains(range, 5) // false 
range.startIndex == 0 // true 
range.endIndex == 5 // true 

let str = "Hello, playground" 
str.rangeOfString("Hello")! // 0..<5 

बढ़िया!

let str = "Hello, playground" 
if let range = str.rangeOfString("Hello") { 
    if range.startIndex == 0 { 
     print("str starts with 'Hello'") 
    } 
} 

मैं लाइन है कि पढ़ता if range.startIndex == 0 {

प्रकार का एक तर्क फूल के साथ आह्वान नहीं किया जा सकता '==' (String.index में त्रुटि निम्न हो रही है, IntegerLiteralConvertible: अब यह असली कोड का उपयोग करते हैं) '

उत्तर

8

rangeOfString वास्तव में String.Index रों की एक सीमा है और न Int रों रिटर्न; दोनों तुलनीय नहीं हैं (भले ही खेल का मैदान 0..<5 के रूप में रेंज दिखाता है)। आप this question के उत्तरों में इसके कारणों के बारे में पढ़ सकते हैं।

आप अपने उदाहरण के बजाय 0 साथ range.startIndex की तुलना की है, तो काम करना चाहते हैं, तो आप str.startIndex से इसकी तुलना करना चाहिए:

let str = "Hello, playground" 
if let range = str.rangeOfString("Hello") { 
    if range.startIndex == str.startIndex { 
     print("str starts with 'Hello'") 
    } 
} 

आप के साथ, कहते हैं रेंज के startIndex से तुलना करने, दूसरे चरित्र की जरूरत है स्ट्रिंग में सूचकांक, तो आप advance समारोह str.startIndex बढ़ाने के लिए 1 द्वारा कि करने के लिए इस्तेमाल करते हैं और तुलना कर सकते हैं range.startIndex:

let str = "Hello, playground" 
if let range = str.rangeOfString("e") { 
    if range.startIndex == advance(str.startIndex, 1) { 
     print("str's 2nd character is 'e'") 
    } 
} 

आप सीमा की लंबाई पता करने की जरूरत है, तो आप distance फ़ंक्शन का उपयोग कर सकते हैं:

let str = "Hello, playground" 
if let range = str.rangeOfString("play") { 
    let length = distance(range.startIndex, range.endIndex) 
    print("found a range \(length) characters long") 
} 
+0

अच्छा जवाब। मुझे लगता है कि यह सब समारोह बेहतर यूनिकोड समर्थन के लिए है। उदाहरण के लिए यह '"ﷺ" 'जैसे पागल पात्रों का समर्थन करता है। मैंने अभी कोशिश की है – Mohsen

+0

बिल्कुल, यह यूनिकोड समर्थन के लिए ऐसा है। असल में यह आपको एक समय में एक चरित्र के चारों ओर कूदने देता है, भले ही वर्ण बहु-बाइट हों। –

+1

@ मोहनन यह एक पागल चरित्र नहीं है बल्कि अरबी में एक वाक्य है जो कहता है: «उस पर शांति» (صلى الله عليه وآله وسلم) मुसलमान पैगंबर की प्रशंसा करने के लिए उपयोग करते हैं। एक सुविधा के रूप में (जैसा कि अक्सर प्रयोग किया जाता है) यह वाक्य एक पैक वाले लिगरेचर ग्लाइफ (कई अन्य लोगों) के रूप में मौजूद है। उम्मीद है कि यह एक रहस्य uncovers :-) –

5

~ = स्विफ्ट में ऑपरेटर

कभी कभी, हम एक नंबर एक सीमा के बीच है अगर जाँच करने के लिए है , और हमेशा की तरह, हम जैसे कुछ कार्य करें:

चेक यदि संख्या 0 से 100 के बीच में शामिल हैं

if number >=0 && number <= 100 { 
    // TODO: 
} 

यह काम करता है, लेकिन हम बेहतर कर सकते हैं और है swiftier। स्विफ्ट स्टैंडर्ड लाइब्रेरी में ~ = ऑपरेटर है, इसलिए हम इसके बजाय कर सकते हैं:

if 0...100 ~= number { 
    // TODO: 
} 
संबंधित मुद्दे