Nital
Nital

Reputation: 6114

How to extract a substring from a string in Swift using Range or any other methodology?

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.

Upvotes: 0

Views: 525

Answers (1)

Leo Dabus
Leo Dabus

Reputation: 236508

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"
}

Upvotes: 2

Related Questions