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

amrnrhlw  于 2023-06-28  发布在  Swift
关注(0)|答案(4)|浏览(160)

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

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

但是如果我不想写类名呢?除了静态方法和属性外,是否有self的等效物?
如果我想从一个静态方法调用另一个静态方法,也是同样的想法:

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

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

我可以在不显式使用MyClass的情况下做到这一点吗?

rsaldnfx

rsaldnfx1#

self也可以在静态方法中工作,像这样:

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

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

svdrlsy42#

正如RobberR上面所写的,你可以只使用self来访问self的静态函数,而self.init(...)用于工厂示例。请注意,您仍然必须在工厂方法中指定MyClass作为返回类型。
作为另一种更通用的方法,您可以让您的类符合工厂协议,该协议包含工厂方法的默认实现。这样,静态工厂方法就不会绑定到任何特定的类,但是可以被任何符合工厂协议的类访问(以及一个额外的帮助协议)。
出厂设置:

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 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
ogsagwnx

ogsagwnx3#

你可以定义一个协议,并像这样使用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();
rqcrx0a6

rqcrx0a64#

你可以创建一个不引用类的工厂方法,像这样:

class MyClass {
    static func factory() -> Self {
        let instance = Self.init()
        // other init here
        return instance
    }
}

相关问题