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

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

问题

  1. 我们应该为此使用结构/枚举/类吗?为什么?
  2. 通过将结构用于此类类似功能,我们是否会增加应用程序大小?
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)
                }
            }
        }
    }
}

【问题讨论】:

  • 服务一般是引用类型。你既不需要也不需要值语义。

标签: ios swift class struct swift5


【解决方案1】:

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

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

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

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

【讨论】:

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