Swift中常用Extension(一)

1,093 阅读2分钟

String

1、URL字符串的编码与解码

在我们开发应用的时候都会发送网络请求,如果拼接的 URL 地址中包含有中文、空格、特殊符号时,就会无法正确访问,或者打开图片链接也含有中文、空格、特殊符号时也会无法正确访问,这时我们就要对其转义

  • 我们可以使用addingPercentEncoding 方法实现编码的功能,也就是将指定的字符集使用%代替,在String的扩展中,我们增加两个属性:urlEncodingurlDecoding
public extension String {
    /// 编码
    var urlEncoding: String {
        if isEmpty { return "" }
        guard let encodeUrlString = addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {
            return self
        }
        return encodeUrlString
    }
    /// 解码
    var urlDecoding: String {
        if isEmpty { return "" }
        guard let decodingUrl = self.removingPercentEncoding else { return self }
        return decodingUrl
    }
}

这样基本就完成了,但是我在开发中遇到过这样的问题,就是后台返回的图片地址已经是编码过的,这时我对其再编码就会有问题,导致打不开。所以我们在编码的时候,不论url有没有编码,我们最好先解码一次

/// 编码
var urlEncoding: String {
    if isEmpty { return "" }
    let urlDecod = urlDecoding // 先解码,防止链接二次编码导致链接打不开
    guard let encodeUrlString = urlDecod.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {
        return self
    }
    return encodeUrlString
}

2、打开URL

public extension String {
    func openURL() {
        guard let url = URL(string: self) else { return }
        guard UIApplication.shared.canOpenURL(url) else { return }
        if #available(iOS 10.0, *) {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
        } else {
            UIApplication.shared.openURL(url)
        }
    }

    /// 拨打电话
    func phone() {
        guard let url = URL(string: "telprompt://\(self)") else { return }
        guard UIApplication.shared.canOpenURL(url) else { return }
        if #available(iOS 10.0, *) {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
        } else {
            UIApplication.shared.openURL(url)
        }
    }
}

3、获取url中的参数

  • 我们可以使用URLComponents来获取url中的参数,可以使用下面两种方法来初始化
/// 根据URL
public init?(url: URL, resolvingAgainstBaseURL resolve: Bool)

/// 根据URL String
public init?(string: String)
  • 我们使用第一种来获取,在URL的扩展中增加一个urlParameters()方法
public extension URL {
    func urlParameters() -> [String: String]? {
        guard let components = URLComponents(url: self, resolvingAgainstBaseURL: true),
        let queryItems = components.queryItems else { return nil }
        return queryItems.reduce(into: [String: String]()) { (result, item) in
            result[item.name] = item.value
        }
    }
}
  • 我们使用第二种来获取,在String的扩展中增加一个urlParameters()方法
public extension String {
    func urlParameters() -> [String: String]? {
        guard let urlComponents = URLComponents(string: self),
        let items = urlComponents.queryItems else { return nil }
        return items.reduce(into: [String: String]()) { (result, item) in
            result[item.name] = item.value
        }
    }
}