2017-04-05 11 views
8

मैं अपने कोड को तेजी से अपडेट कर रहा हूं 3. रेंज को एनएसआरेंज में परिवर्तित करने में त्रुटि प्राप्त करना। स्विफ्ट 3 में ऐसा कैसे करें?एनएसआरेंज में रेंज को कैसे परिवर्तित करें?

func nsRange(_ range : Range<String.Index>) -> NSRange { 
    let utf16from = String.UTF16View.Index(range.lowerBound, within: utf16) 
    let utf16to = String.UTF16View.Index(range.upperBound, within: utf16) 
    return NSRange(location: utf16.startIndex.distanceTo(utf16from), length: utf16from.distanceTo(utf16to)) 
} 
+0

http://stackoverflow.com/a/30404532/1187415 स्विफ्ट 1.2, 2 के लिए रूपांतरण के तरीकों है, और 3. –

+0

... और स्विफ्ट 4. –

उत्तर

28

Xcode 9 • स्विफ्ट 4

extension StringProtocol where Index == String.Index { 
    func nsRange(from range: Range<Index>) -> NSRange { 
     return NSRange(range, in: self) 
    } 
} 

let string = "Hello USA !!! Hello World !!!" 

if let range = string.range(of: "Hello World") { 
    let nsRange = string.nsRange(from: range) 
    (string as NSString).substring(with: nsRange) // "Hello World" 
} 

तुम भी इसी nsRange बना सकते हैं (:) StringProtocol पालन का विस्तार विधि का:

extension StringProtocol where Index == String.Index { 
    func nsRange<T: StringProtocol>(of string: T, options: String.CompareOptions = [], range: Range<Index>? = nil, locale: Locale? = nil) -> NSRange? { 
     guard let range = self.range(of: string, options: options, range: range ?? startIndex..<endIndex, locale: locale ?? .current) else { return nil } 
     return NSRange(range, in: self) 
    } 
    func nsRanges<T: StringProtocol>(of string: T, options: String.CompareOptions = [], range: Range<Index>? = nil, locale: Locale? = nil) -> [NSRange] { 
     var start = range?.lowerBound ?? startIndex 
     let end = range?.upperBound ?? endIndex 
     var ranges: [NSRange] = [] 
     while start < end, let range = self.range(of: string, options: options, range: start..<end, locale: locale ?? .current) { 
      ranges.append(NSRange(range, in: self)) 
      start = range.upperBound 
     } 
     return ranges 
    } 
} 

let string = "Hello USA !!! Hello World !!!" 

if let nsRange = string.nsRange(of: "Hello World") { 
    (string as NSString).substring(with: nsRange) // "Hello World" 
} 
let nsRanges = string.nsRanges(of: "Hello") 
print(nsRanges) // "[{0, 5}, {19, 5}]\n" 
+0

के लिए तेजी से 3 कोड गलत जांच है कि: https: //developer.apple.com/documentation/swift/string.utf16view – apinho

1

सब मैं इस मद के लेखक को बड़ा धन्यवाद कहना चाहते हैं सबसे पहले, कुछ समय पहले मैं उसका समाधान स्विफ्ट 3. के लिए इस्तेमाल किया

(मैं पहले से ही अपनी प्रतिष्ठा में वृद्धि हुई है), लेकिन मैं विशेष विस्तार की पेशकश करेगा रेंज के लिए ही

स्विफ्ट 4

extension Range where Bound == String.Index { 
    var nsRange:NSRange { 
     return NSRange(location: self.lowerBound.encodedOffset, 
         length: self.upperBound.encodedOffset - 
           self.lowerBound.encodedOffset) 
    } 
} 
इस मामले में

में

पिछले नमूना

012 की तरह लग सकता है
let string = "Hello USA !!! Hello World !!!" 

if let nsrange = string.range(of: "Hello World")?.nsRange { 
    (string as NSString).substring(with: nsrange) // "Hello World" 
} 
+1

स्विफ्ट 4 'रेंज ' से 'NSRange' बनाने के लिए मूल तरीका प्रस्तुत करता है, लियो का उत्तर देखें। – vadian

+0

मैंने देखा है कि लियो ने एनएसआरेंज (रेंज, इन: सेल्फ) प्रदान किया है जिसके लिए एक स्ट्रिंग इंस्टेंस की आवश्यकता है, लेकिन यदि आपको रेंज को एनएसआरेंज में कनवर्ट करने की आवश्यकता है तो क्या होगा। NSRange.init (रेंज ) काम नहीं करता है क्योंकि स्ट्रिंग.इंडेक्स प्रोटोकॉल 'फिक्स्डविड्थइंटर' के अनुरूप नहीं है –

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