用于网络调用的结构/枚举与类

Posted

技术标签:

【中文标题】用于网络调用的结构/枚举与类【英文标题】:Struct/Enum vs Class for network calls 【发布时间】:2021-10-29 09:29:46 【问题描述】:

我一直想知道哪种方法是处理常见网络代码的正确方法或有效方法。对于每个功能的网络调用,我都有一个共同的地方。目标是获取数据,解码并将其返回给调用者,例如下面

问题

    我们应该为此使用结构/枚举/类吗?为什么? 通过将结构用于此类类似功能,我们是否会增加应用程序大小?
protocol ModuleNetworkProvider 
func getDetails(for identifier, completion: @escaping (detailsObject?, Error?) -> ()) 


struct ModuleNetwork: ModuleNetworkProvider 
    func getDetails(for identifier, completion: @escaping (detailsObject?, Error?) -> ()) 
        NetworkManager.sessionManager.request(getDetails)  response
            switch response.result 
            case .failure(let error):
                completion(nil, error)
            case .success(let data):
                do 
                    let detailsObjectData = try JSONDecoder().decode(detailsObject.self, from: data)
                    completion(detailsObjectData, nil)
                 catch(let error) 
                    completion(nil, error)
                
            
        
    

【问题讨论】:

服务一般是引用类型。你既不需要也不需要值语义。 【参考方案1】:

我认为没有“正确”的方法。 我将遵循的准则。

不要使用静态函数,这会增加测试难度。您可以使用依赖注入,但我个人更喜欢解析执行 API 调用的服务。 使用协议,使测试更容易,您甚至可以使用Sourcery 自动生成模拟。 如果你只需要调用一些东西并传递结果,struct 也可以做到。 如果您需要经常传递实例,类可能比结构更好。 如果在您的逻辑中,您还需要将一些数据放入数据库中,您既要获取数据又要存储数据,很可能您需要使用一个类。如果你不改变 self,即使 struct 也可以工作,你可以在捕获列表中添加数据库服务。 保持一致。

我知道你们中的一些人可能不同意以上所有内容。

另一种选择是将依赖项声明为闭包,并为每个范围创建环境(例如:视图、功能等),主题有点复杂,检查Pointfree,他们甚至有一个真正的应用程序,@ 987654323@,在实践中更好地了解这个原理。

【讨论】:

感谢这有很大帮助。但是当在不同的模型中传递时,结构是否会创建一个新副本(未编辑) 如果你传递它并存储它,比yes,它被复制,如果你传递它并只是使用它,那么它不会被复制。如果将其添加到捕获列表,则会被复制。结构是值类型,有关更多详细信息,请查看苹果文档。 developer.apple.com/swift/blog/?id=10

以上是关于用于网络调用的结构/枚举与类的主要内容,如果未能解决你的问题,请参考以下文章

C#图解教程 第十一章 枚举

10. 结构和枚举

快速归类整型常数——枚举

枚举与结构体

java-枚举

关于delphi枚举类型的调用的问题?谢谢大家