如果您不需要多个实例,那么使用类型方法而不是实例方法会更好吗

时间:2018-02-06 00:00:04

标签: swift oop

我正在理解OOP

使用MyClass.myFunction()

更好吗?
class MyClass {
   static func myFunction() {
      // Do suff
   }
}

或者更好的做MyClass().myFunction(),其中

class MyClass {
   func myFunction() {
      // Do suff
   }
}

对我来说,我不需要有多个实例,所以我应该坚持使用第一个实例吗?

2 个答案:

答案 0 :(得分:3)

编写实例方法与静态方法的选择不是关于您打算创建的实例数量,而是关于该方法实际需要做什么的更多信息。如果您的方法需要访问它被调用的实例的任何属性,那么它显然需要是一个实例方法。例如,如果不需要访问属性,并且该方法是与类相关的帮助器,则静态方法可能有意义。

例如:

class MyClass {

   var id: String

   init(id: String) {...}

   func printId() {
      print(self.id)
   }

   static func className() -> String {
      return "MyClass"
   }

}

这将允许您通过调用静态方法MyClass.className()来获取类的名称,而无需实例。如果您有一个实例并想要id,则可以调用实例方法printId

let instance = MyClass(id: "abc")
instance.printId() //prints "abc"

这显然是一个过于简单的例子,但它说明了在决定如何声明方法时需要提出的最基本的问题之一。

作为良好使用静态方法的更好示例,您可能有一个静态方法负责从外部API获取实例化类所需的数据。这最有意义的是静态方法,因为在API调用完成之前,您不会拥有创建实例所需的内容(并返回所需的所有属性)。

答案 1 :(得分:0)

使用单例模式。像这样:

class MyClass{
   static let sharedInstance = MyClass()
   private init(){} //Make your constructor private

   func myFunction() {
      // Do suff
    }
}

然后像这样访问:

MyClass.sharedInstance.myFunction()

只有一个类的实例存在。您可以添加其他属性和功能。