0

I have this program and I am trying to extract the number between the two strings but I am getting compile time error (show below) when I use substringWithRange function

Compile-time Error:

/Users/chandeln/Documents/ApplePaySwag-Starter/ApplePaySwag/BuySwagViewController.swift:382:47: Cannot convert value of type 'Range<Int>' to expected argument type 'Range<Index>' (aka 'Range<String.CharacterView.Index>')

Code:

let text = "[DeviceAccountNumber-Start]4817499130007700[DeviceAccountNumber-End]"

//get the position of the start string 
let danStartTagRange: Range<String.Index> = text.rangeOfString("[DeviceAccountNumber-Start]")!
let danStartTagIndex: Int = text.startIndex.distanceTo(danStartTagRange.startIndex)
let danStartTagEndingIndex: Int = text.startIndex.distanceTo(danStartTagRange.endIndex)
print("danStartTagRange = \(danStartTagRange)")
print("danStartTagIndex = \(danStartTagIndex)")
print("danStartTagEndingIndex = \(danStartTagEndingIndex)")

//get the position of the end string 
let danEndTagRange: Range<String.Index> = text.rangeOfString("[DeviceAccountNumber-End]")!
let danEndTagIndex: Int = text.startIndex.distanceTo(danEndTagRange.startIndex)
let danEndTagEndingIndex: Int = text.startIndex.distanceTo(danEndTagRange.endIndex)
print("danEndTagRange = \(danEndTagRange)")
print("danEndTagIndex = \(danEndTagIndex)")
print("danEndTagEndingIndex = \(danEndTagEndingIndex)")
let rangeOfDan = danStartTagEndingIndex..<danEndTagIndex

//get the actual dan now based on the above derived variables
let dan = text.substringWithRange(rangeOfDan)
let dan =  substringFromIndex(danStartTagEndingIndex);
print("dan = \(dan)")

Output from previous runs:

danStartTagRange = 0..<27
danStartTagIndex = 0
danStartTagEndingIndex = 27
danEndTagRange = 43..<68
danEndTagIndex = 43
danEndTagEndingIndex = 68

I am using Swift 2.3

Please guide.

1
  • Other methodology is regular expression : "\\d+" Commented Oct 4, 2016 at 20:36

1 Answer 1

2

Try like this:

Xcode 8 • Swift 2.3

let text = "[DeviceAccountNumber-Start]4817499130007700[DeviceAccountNumber-End]"

if let startIndex = text.rangeOfString("[DeviceAccountNumber-Start]")?.endIndex,
    let endIndex = text.rangeOfString("[DeviceAccountNumber-End]")?.startIndex {
    let dan = text.substringWithRange(startIndex..<endIndex)
    print("dan = \(dan)")   // "dan = 4817499130007700\n"
}

Xcode 8 • Swift 3

let text = "[DeviceAccountNumber-Start]4817499130007700[DeviceAccountNumber-End]"

if let lowerBound = text.range(of: "[DeviceAccountNumber-Start]")?.upperBound,
    let upperBound = text.range(of: "[DeviceAccountNumber-End]")?.lowerBound {
    let dan = text.substring(with: lowerBound..<upperBound)
    print("dan = \(dan)")   // "dan = 4817499130007700\n"
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.