【问题标题】:Making a shared class in swift快速创建共享课程
【发布时间】:2016-08-07 18:44:53
【问题描述】:

在swift中,无论如何我可以创建一个共享类吗?也就是说,假设有一个名为 Value 的类:

class Value{
  var a = 0
}

我想使用这个类在不同的对象实例之间共享。 例如,

class Main{
  func main(){
    print(Value.a)
    Value.a++
  }
}

class OtherClass{
  func otherMain(){
    print(Value.a)
    Value.a++
  }
}


let main = Main()
let other = OtherClass()
//I want this call to print 0
main.main()
//I want this call to print 1
other.otherMain()

我在 var a 上尝试了静态,但它不会让我做诸如加法之类的算术...但是如果我将值更改为静态而不是类,它就可以工作。我认为 struct 和 class 之间的唯一区别是变量类型或引用类型......

我将不胜感激。谢谢

【问题讨论】:

  • 为什么不直接创建一个全局变量var a: Int = 0
  • 我正在处理一个包含许多 swift 文件的大型项目。所以我希望有一个单独的类来处理一种类型的变量,并希望使用该类来像表格一样将其数据共享给其他实例。
  • 你可以使用单例模式。
  • 看来你想要的架构会很脆弱。
  • Sulthan - 这是为什么呢?

标签: swift


【解决方案1】:

不幸的是,做你想做的事的最好方法就是根本不去做。您正在设计的架构似乎非常脆弱,两个独立的类不应依赖于共享对象状态,如果它们依赖于共享对象状态,则它们应该通过类继承或协议相关联。

更好的解决方案是:

class MyClass {
    static var a = 0
}

class SubclassA: MyClass {
     func someFunc() {
         print(self.dynamicType.a)
         self.dynamicType.a += 1
     }
}

class SubclassB: MyClass {
    func otherFunc() {
        print(self.dynamicType.a)
    }
}

与以前的解决方案相比,您应该这样做有几个原因:

  1. 您的共享状态可以对这两个类保持私有。这些类之外的任何人都不能或不应该修改该值。

  2. 单例模式有时很有用,但也有很多问题。 This article 解释得比我还好。

您必须将您的应用程序和代码架构视为一个状态机,从一种状态转移到另一种状态。目标是编写可重用、模块化、通用且状态尽可能少的代码。你的代码越无状态越好。这就是 ReactJS 和 ReactiveCocoa 等平台背后的全部理念;它们有助于简化应用程序状态。

您可能正在寻找的是数据持久性,例如 Realm 或 CoreData,您可以将数据持久保存到磁盘,然后您可以在以后根据需要将其读回。例如,想象一下,您的共享状态不是Int,而是UIImages 的数组。使用单例模式,您可以始终将这些图像保存在内存中。如果列表的长度增加到 200 或 300 怎么办?那么你有内存问题。

【讨论】:

  • 好的,我明白了。但是我的两个类不是独立的,所以我认为继承是我需要的。在您的代码中,subClassA/B 继承 MyClass?那么它应该是 SubClassA/B: MyClass 吗? dynamicType 是从哪里来的?
  • 抱歉,我修正了我的错字。 dynamicType 指的是类实例,因为a 是静态变量,而不是实例变量。如果这些类不相关但它们共享相同的数据,那么可能需要重新考虑您的数据设计。
  • 我不同意这将是一种改进。变量不应该像这样从另一个类直接递增。我会更好地将计数器设为私有并声明一个将执行增量的函数。这将使代码更具可读性。
  • 我同意,这就是我要说的。我只是尽量将我的代码示例保留在@hikki's。
猜你喜欢
  • 1970-01-01
  • 2010-12-10
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多