如何在 swift 4 中解析部分 link?

How to parse partial link in swift 4?

我正在尝试将来自 API 的图像显示到我的 table 单元格视图中。但它在那里给出了部分 link,结果,我收到 NSURL 连接错误代码 -1002.

这是我的APIlink:https://api.opendota.com/api/heroStats

我正在尝试解析其中的“图标”: "img": "/apps/dota2/images/heroes/antimage_full.png?", "图标": "/apps/dota2/images/heroes/antimage_icon.png",

我的代码: // 生成图像视图

if let imageURL = URL(string: heroes[indexPath.row].icon){
    print (imageURL)
    DispatchQueue.global().async {
        let data = try? Data (contentsOf: imageURL)
        if let data = data {
            let image = UIImage(data: data)
            DispatchQueue.main.async {
                cell.charIcon.image = image
            } //end of 2nd dispatch
        }//end of if
    }//end of 1st dispatch
}// end of imageURL

我该如何解决这个问题? swift 4 有什么简单的方法吗?

您可以获得 api link 的 url 组件并使用您的图标“部分 link” 设置路径 属性 URL 个组件。之后,您只需要获得 url 组件的结果 url:

let apiLink = "https://api.opendota.com/api/heroStats"
let apiURL = URL(string: apiLink)!
if var urlComponents = URLComponents(url: apiURL, resolvingAgainstBaseURL: false) {
    let iconString = "/apps/dota2/images/heroes/antimage_icon.png"
    urlComponents.path = iconString
    if let iconURL = urlComponents.url {
        print(iconURL.absoluteString)
    }
}

这将打印

https://api.opendota.com/apps/dota2/images/heroes/antimage_icon.png



您可以根据新的路径字符串创建自定义方法 return 新的 URL,如下所示:

extension URL {
    var urlComponents: URLComponents? {
        return URLComponents(url: self, resolvingAgainstBaseURL: false)
    }
    func bySettingNew(path: String) -> URL? {
        guard var urlComponents = urlComponents else { return nil }
        urlComponents.path = path
        return urlComponents.url
    }
}

let apiLink = "https://api.opendota.com/api/heroStats"
let apiURL = URL(string: apiLink)!
let iconString = "/apps/dota2/images/heroes/antimage_icon.png"

if let iconURL = apiURL.bySettingNew(path: iconString) {
    print(iconURL.absoluteString)
}


您还可以将此助手添加到您的项目中,以便更轻松地将图像异步下载到您的图像视图中:

extension UIImageView {
    func downloaded(from url: URL, contentMode mode: UIView.ContentMode = .scaleAspectFit) {
        URLSession.shared.dataTask(with: url) { data, response, error in
            guard
                let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
                let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
                let data = data, error == nil,
                let image = UIImage(data: data)
                else { return }
            DispatchQueue.main.async() { [weak self] in
                self?.contentMode = mode
                self?.image = image
            }
        }.resume()
    }
}

if let imageURL = apiURL.bySettingNew(path: heroes[indexPath.row].icon) {
    cell.charIcon.downloaded(from: imageURL)
}