String 无法将子字符串转换为部分范围运算符Swift 4

String 无法将子字符串转换为部分范围运算符Swift 4,string,range,substring,swift4,xcode9,String,Range,Substring,Swift4,Xcode9,在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

在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

    }
}
同样在阅读了关于子字符串的文章之后,我仍然不太清楚它们的好处。有人把它们用于URL吗

甚至语法也不如点符号简洁。

这似乎有效

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

    }
}