微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift模板功能

如何解决Swift模板功能

我想知道如何在Swift 5中删除一些重复的方法

func CreateProjectPossibleAccount(possibleAccount: ProjectPossibleAccount) -> Data {
        var dataToReturn: Data?
        self.dispatchGroup.enter()
        do {
            var request = getUrlRequestFor(RequestType.post)
            request.httpBody = try JSONEncoder().encode(possibleAccount)
            URLSession.shared.dataTask(with: request) {
            (data,response,err) in
                guard let data = data else {return}
                dataToReturn = data
                self.dispatchGroup.leave()
            }.resume()
        } catch {
            print(error.localizedDescription)
        }
        self.dispatchGroup.wait()
        return dataToReturn!
    }
    
    func CreateMaterialIssueItem(item: NewMaterialIssueItem) -> Data {
        var dataToReturn: Data?
        self.dispatchGroup.enter()
        do {
            var request = getUrlRequestFor(RequestType.post)
            request.httpBody = try JSONEncoder().encode(item)
            URLSession.shared.dataTask(with: request) {
            (data,err) in
                guard let data = data else {return}
                dataToReturn = data
                self.dispatchGroup.leave()
            }.resume()
        } catch {
            print(error.localizedDescription)
        }
        self.dispatchGroup.wait()
        return dataToReturn!
    }

我有几个类似的功能,其中唯一真正的区别是我创建的自定义类型。有没有办法仅将此函数命名为Post(item:T)并传入所有唯一类型?

解决方法

您可以使用泛型来避免代码重复。在下面的示例中,我假设ProjectPossibleAccountNewMaterialIssueItem实现了Decodable协议,并且RequestType是一个枚举。 dispatchGroup也可能成为该方法的参数。

func request<T: Encodable>(item: T,requestType: RequestType) -> Data {
    var dataToReturn: Data?
    self.dispatchGroup.enter()
    
    do {
        var request = getUrlRequestFor(requestType)
        request.httpBody = try JSONEncoder().encode(item)
        URLSession.shared.dataTask(with: request) {
        (data,response,err) in
            guard let data = data else {return}
            dataToReturn = data
            self.dispatchGroup.leave()
        }.resume()
    } catch {
        print(error.localizedDescription)
    }
    
    self.dispatchGroup.wait()
    return dataToReturn!
}

,您可以这样调用方法:

let possibleAccount: ProjectPossibleAccount = ProjectPossibleAccount()
let data = request(item: possibleAccount,requestType: .post)

上一个示例的另一种方法(并且因为它很简单)是将item param数据类型指定为Encodable,如下所示:

func request(item: Encodable,requestType: RequestType) -> Data

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。