Swift:从静态方法获取当前 class

Swift: Get current class from a static method

在 Swift 中,假设我想添加一个 returns 实例的静态工厂方法:

class MyClass {
  static func getInstance() {
    return MyClass(someProperty);
  }
}

但是如果我不想写 class 名字怎么办?除了静态方法和属性,是否有 self 的等价物?

同样的想法,如果我想从一个静态方法调用另一个静态方法:

class MyClass {
  static func prepare(){
    //Something
  }

  static func doIt() {
    MyClass.prepare();
  }
}

我可以在不显式使用 MyClass 的情况下执行此操作吗?

self 也适用于静态方法,如下所示:

class MyClass {
  static func prepare(){
    print("Hello");
  }

  static func doIt() {
    self.prepare();
  }
}

如 RobberR 上面所写,您可以只使用 self 来访问 self 的静态函数,并使用 self.init(...) 作为您的工厂示例。请注意,您仍然必须在工厂方法中将 MyClass 指定为 return 类型。

作为另一种更通用的方法,您可以让 class 符合包含工厂方法默认实现的工厂协议。有了这个,静态工厂方法就不会绑定到任何特定的 class,但是可以 访问 任何符合工厂协议的 class (和通用初始化程序的附加帮助协议)。

出厂设置:

protocol FactoryInitializers {
    var commonProperty : Int { get set }
    init(commonProperty: Int)
}

protocol FactoryMethods {
    typealias T: FactoryInitializers
    static var defaultStaticCommonProperty : Int { get }
}
extension FactoryMethods {
    static func getInstance() -> T {
        return T(commonProperty: defaultStaticCommonProperty)
    }
    static func getInstanceFor(commonProperty commonProperty: Int) -> T {
        return T(commonProperty: commonProperty)
    }
}

protocol Factory : FactoryMethods, FactoryInitializers { }

示例 class 一致性:

class MyClass : Factory {
    typealias T = MyClass
    static var defaultStaticCommonProperty : Int = 1

    var commonProperty : Int = 0

    required init(commonProperty: Int) {
        self.commonProperty = commonProperty
    }
}

class MyOtherClass : Factory {
    typealias T = MyOtherClass
    static var defaultStaticCommonProperty : Int = 10

    var commonProperty : Int = 0

    required init(commonProperty: Int) {
        self.commonProperty = commonProperty
    }
}

用法示例:

var foo = MyClass.getInstance()
print(foo.dynamicType)    // "MyClass"
print(foo.commonProperty) // 1
foo = MyClass.getInstanceFor(commonProperty: 5)
print(foo.commonProperty) // 5

var bar = MyOtherClass.getInstance()
print(bar.dynamicType)    // "MyOtherClass"
print(bar.commonProperty) // 10

您可以定义协议并像这样使用 swift generics

protocol Vehicle {
  init()
}

class MyVehicleFactory<T:Vehicle> {
  static func getInstance() -> T {
    return T()
  }
}

复制您代码的人可以这样做:

class Car : Vehicle {
  required init() { }
}
let car = MyVehicleFactory<Car>.getInstance();