ffunc calculateRange(symbol: String, amountText: String) -> Range<String.Index>? {
return amountText.range(of: symbol)
}
func calculateNSRange(range: Range<String.Index>, in string: String) -> NSRange {
return NSRange(range, in: string)
}
let dollar = “$”
let rupee = “₹”
let dollarAmount = “(dollar)2,345”
let rupeeAmount = “(rupee)2,345"
if let range = calculateRange(symbol: dollar, amountText: dollarAmount) {
let nsrange = calculateNSRange(range: range, in: dollarAmount)
print(“NSRange for $: (nsrange)“)
}
if let range = calculateRange(symbol: rupee, amountText: rupeeAmount) {
let nsrange = calculateNSRange(range: range, in: rupeeAmount)
print(“NSRange for ₹: (nsrange)“)
}
// Prints
//NSRange of $: {0, 1}
//NSRange of ₹: {0, 1}
if let range = calculateRange(symbol: dollar, amountText: dollarAmount) {
let dollarNSString = NSString(string: dollarAmount)
let nsrange = calculateNSRange(range: range, in: dollarNSString as String)
print(“@NSRange for $: (nsrange)“)
}
if let range = calculateRange(symbol: rupee, amountText: rupeeAmount) {
let rupeeNSString = NSString(string: rupeeAmount)
let nsrange = calculateNSRange(range: range, in: rupeeNSString as String)
print(“@NSRange for ₹: (nsrange)“)
}
// Prints
//@NSRange for $: {0, 1}
//@NSRange for ₹: {0, 3}
If you run above code in playground you’ll see when I use same string content as NSString I get the different range. What I’m doing is calculating Range from String then converting that Range into NSRange using NSString that has the same content. So my question is why NSRange(range, in: string) method not calculating right range.
As far as I understood that NSString storage is different than String, but they are also easily bridged to each other. Can anyone explains me if they are easily bridged then why do we have different behavior of NSRange(range, in: string) ?