【问题标题】:how to change value in struct globally in swift如何在swift中全局更改struct中的值
【发布时间】:2021-11-02 20:59:49
【问题描述】:

所以我有一个 api 请求,它从一个假的 api url 请求一堆数据,我得到的数据被放在一个占位符上,我只想有一个全局变量能够使用该可编码数组我的 collectionviews 中的数据。

   struct productsList{
        static var itemsList = [ProductItem]()
    
    }
    func getProducts() {
        storeRepo
            .getAllProducts()
            .subscribe { result in
                productsList.itemsList = result
                for item in productsList.itemsList{
                    print(item.category)
                }
            } onError: { error in
                print(error.localizedDescription)
            }.disposed(by: disposeBag)
    }
    func printReuslt() {
        for i in productsList.itemsList{
            print(i.id)
        }
    }

请注意,它不是打印 printResult(),而是在 .subscribe 内部循环

请注意,我正在使用 Moya 以及​​ RXswift

【问题讨论】:

  • printResult 在哪里被调用?

标签: arrays swift rx-swift moya


【解决方案1】:

您要查找的内容称为 Singleton。 Swift 让这变得非常容易。基本上,简短而甜蜜的是,您创建的结构将自身初始化为自身的属性。任何时候访问(在本例中)APIHandler.shared,您都将获得对唯一单个对象的引用,该对象具有本例中的其他属性 dataObj1someObj2

   class APIHandler {
        let shared = APIHandler()
        var dataObj1: YourObj?
        var someObj2: YourObj2?
    
        init() {
             self.someObj1 = yourMethodCall()
             self.someObj2 = someCalculation()
        }
    }

这是您从另一个类访问它的方式。请注意,您可以访问APIHandler.someObj,如果您没有创建对象,这将导致空引用异常,因此在执行此操作时请始终访问shared 属性。

class MainClass {
     let apiHandler: APIHandler?

      override func viewDidLoad(...) {
          super.viewDidLoad(...)
          apiHandler = APIHandler.shared
      }
}

【讨论】:

  • 一个可变结构单例可能不会像你期望的那样运行。 APIHandler.shared 的每个调用者都将拥有自己的 APIHandler 副本,并且对属性的更改不会反映在其他副本中。 “单例”意味着该类型具有标识;有一种方法可以区分实例之间的差异,即使它们具有相同的属性值。这意味着它应该是一个引用类型(一个类)。
  • 对 Rob 的评价非常好,我会尽快更新一个更合适的答案。我没有考虑过每次通话都会收到一个新的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多