2017-09-20 8 views
5

खोलें मैं अपने ऐप को स्विफ्ट 4, एक्सकोड 9 में माइग्रेट करने का प्रयास कर रहा था। मुझे यह त्रुटि मिलती है। यह एक तृतीय पक्ष ढांचे से आ रहा है।दूरी (से: से :) 'अनुपलब्ध है: कोई भी स्ट्रिंग व्यू इंडेक्स रूपांतरण स्विफ्ट 4 में विफल हो सकता है; कृपया वैकल्पिक सूचकांक

दूरी (से: :) :) अनुपलब्ध है: कोई भी स्ट्रिंग व्यू इंडेक्स रूपांतरण स्विफ्ट 4 में विफल हो सकता है; वैकल्पिक सूचकांक

func nsRange(from range: Range<String.Index>) -> NSRange { 
    let utf16view = self.utf16 
    let from = range.lowerBound.samePosition(in: utf16view) 
    let to = range.upperBound.samePosition(in: utf16view) 
    return NSMakeRange(utf16view.distance(from: utf16view.startIndex, to: from), // Error: distance(from:to:)' is unavailable: Any String view index conversion can fail in Swift 4; please unwrap the optional indices 
         utf16view.distance(from: from, to: to))// Error: distance(from:to:)' is unavailable: Any String view index conversion can fail in Swift 4; please unwrap the optional indices 
} 
+0

https://stackoverflow.com/a/30404532/2083655 – Silmaril

+3

स्विफ्ट 4 में स्ट्रिंग और एनएसएसटींग श्रेणियों के बीच कनवर्ट करने के लिए अंतर्निहित विधियां हैं, इसलिए आपको अब उस एक्सटेंशन की आवश्यकता नहीं है। Https://stackoverflow.com/a/30404532/1187415 पर नवीनतम अपडेट पर नज़र डालें। –

+0

वास्तव में बहुत अच्छा, खुशी है कि मैंने आपकी टिप्पणी देखी, लगभग याद आ गई :) धन्यवाद – AamirR

उत्तर

-1

त्रुटि का कहना है कि दूरी आप पैदा कर रहे हैं optionals कर रहे हैं और unwrapped करने की आवश्यकता खोलने कृपया। इस प्रयास करें:

func nsRange(from range: Range<String.Index>) -> NSRange { 
    let utf16view = self.utf16 
    guard let lowerBound = utf16view.distance(from: utf16view.startIndex, to: from), let upperBound = utf16view.distance(from: from, to: to) else { return NSMakeRange(0, 0) } 
    return NSMakeRange(lowerBound, upperBound) 
} 

हालांकि वापसी guard बयान में बेहतर संभाला जा सकता है। मैं फंक्शन NSRange? के रिटर्न प्रकार को बनाने की सलाह दूंगा और जहां भी आप गलत मूल्यों को वापस करने से बचने के लिए फ़ंक्शन को कॉल करते हैं, वहां शून्य की जांच करें।

+0

इसकी फेंकने वाली त्रुटि 'सशर्त बाध्यकारी के लिए प्रारंभकर्ता के पास वैकल्पिक प्रकार होना चाहिए, न कि' स्ट्रिंग.यूटीएफ 16 व्यू। इंडेक्सडिस्टेंस '(उर्फ' इंट ') ' –

-1

की जांच करें:

let dogString = "Dog‼" 
let range = dogString.range(of: "")! 

// यह रेंज

let strRange = dogString.range(range: range) 
print((dogString as NSString).substring(with: strRange!)) // 

extension String { 
    func range(range : Range<String.Index>) -> NSRange? { 
     let utf16view = self.utf16 
     guard 
      let from = String.UTF16View.Index(range.lowerBound, within: utf16view), 
      let to = String.UTF16View.Index(range.upperBound, within: utf16view) 
     else { return nil } 
     let utf16Offset = utf16view.startIndex.encodedOffset 
     let toOffset = to.encodedOffset 
     let fromOffset = from.encodedOffset 
     return NSMakeRange(fromOffset - utf16Offset, toOffset - fromOffset) 
    } 
} 

उपयोग कर रहा है // यह NSRange

उपयोग कर रहा है
let strNSRange = dogString.range(nsRange: NSRange(range, in: dogString)) 
print((dogString as NSString).substring(with: strNSRange!)) // 

extension String { 
    func range(nsRange: NSRange) -> NSRange? { 
     guard 
      let from16 = utf16.index(utf16.startIndex, offsetBy: nsRange.location, limitedBy: utf16.endIndex), 
      let to16 = utf16.index(utf16.startIndex, offsetBy: nsRange.length, limitedBy: utf16.endIndex), 
      let from = from16.samePosition(in: self), 
      let to = to16.samePosition(in: self) 
      else { return nil } 
     return NSMakeRange(from.encodedOffset, to.encodedOffset) 
    } 
} 
6

आप बस इस तरह वैकल्पिक सूचकांक खोलने कर सकते हैं:

func nsRange(from range: Range<String.Index>) -> NSRange? { 
    let utf16view = self.utf16 
    if let from = range.lowerBound.samePosition(in: utf16view), let to = range.upperBound.samePosition(in: utf16view) { 
     return NSMakeRange(utf16view.distance(from: utf16view.startIndex, to: from), utf16view.distance(from: from, to: to)) 
    } 
    return nil 
} 
संबंधित मुद्दे

 संबंधित मुद्दे