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();
在 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();