davidoliverdoswell
davidoliverdoswell

Reputation: 51

Trouble converting Substrings to Partial Range Operators Swift 4

Having no luck creating a partial range in Swift 4

import Foundation

public extension String {

public var URLScheme: String? {
    guard let schemeRange = self.range(of: "://") else { return nil }
    return self.substring(to: schemeRange.lowerBound)
}

public var URLPortNumber: Int {
    guard let portRange = self.range(of: ":", options: .backwards) else { return -1 }

    let startIndex = self.index(portRange.upperBound, offsetBy: 0)
    let endIndex = self.index(portRange.upperBound, offsetBy: 2)
    guard self[startIndex...endIndex] != "//" else { return -1 }

    return Int(self.substring(from: portRange.upperBound))!
}

public var URLHost: String {
    var host = self

    if let scheme = self.URLScheme {
        host = host.substring(from: self.index(self.startIndex, offsetBy: (scheme + "://").characters.count))
    }

    if let portRange = host.range(of: ":") {
        host = host.substring(to: portRange.lowerBound)
    }

    return host

    }
}

Also after reading the documentation on Substrings, I am still less than clear on their benefit. Has anyone used them for URLs?

Even the syntax is less succinct than dot notation.

Upvotes: 1

Views: 258

Answers (1)

davidoliverdoswell
davidoliverdoswell

Reputation: 51

This seems to work!

import Foundation

public extension String {

public var URLScheme: String? {
    guard let schemeRange = self.range(of: "://") else { return nil }
    return String(describing: schemeRange.lowerBound)
}

public var URLPortNumber: Int {
    guard let portRange = self.range(of: ":", options: .backwards) else { return -1 }

    let startIndex = self.index(portRange.upperBound, offsetBy: 0)
    let endIndex = self.index(portRange.upperBound, offsetBy: 2)
    guard self[startIndex...endIndex] != "//" else { return -1 }

    return Int(String(describing: portRange.upperBound))!
}

public var URLHost: String {
    var host = self

    if let scheme = self.URLScheme {
        host = String(describing: self.index(self.startIndex, offsetBy: (scheme + "://").characters.count))
    }

    if let portRange = host.range(of: ":") {
        host = String(describing: portRange.lowerBound)
    }

    return host

    }
}

Upvotes: 1

Related Questions