Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to convert Range in NSRange? [duplicate]

Tags:

swift

I am updating my code in swift 3. Getting error in converting Range into NSRange. How to do that in swift 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)) } 
like image 747
Aashish Nagar Avatar asked Apr 05 '17 13:04

Aashish Nagar


1 Answers

Xcode 11 • Swift 5.1

import Foundation  extension RangeExpression where Bound == String.Index  {     func nsRange<S: StringProtocol>(in string: S) -> NSRange { .init(self, in: string) } } 

let string = "Hello USA 🇺🇸 !!! Hello World !!!" if let nsRange = string.range(of: "Hello World")?.nsRange(in: string) {     (string as NSString).substring(with: nsRange) //  "Hello World" } 

You can also create the corresponding nsRange(of:) method extending StringProtocol:

extension StringProtocol {     func nsRange<S: StringProtocol>(of string: S, options: String.CompareOptions = [], range: Range<Index>? = nil, locale: Locale? = nil) -> NSRange? {         self.range(of: string,                    options: options,                    range: range ?? startIndex..<endIndex,                    locale: locale ?? .current)?             .nsRange(in: self)     }     func nsRanges<S: StringProtocol>(of string: S, 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(range.nsRange(in: self))             start = range.lowerBound < range.upperBound ? range.upperBound :             index(range.lowerBound, offsetBy: 1, limitedBy: endIndex) ?? endIndex         }         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" 
like image 128
Leo Dabus Avatar answered Oct 14 '22 01:10

Leo Dabus