Swift class 中的可继承静态工厂方法
Inheritable static factory method in Swift class
考虑在 Objective-C 中编写的这个静态工厂方法:
@implementation User
+ (instancetype)named:(NSString *)name {
let user = [self new];
user.name = name;
return user;
}
@end
如何在 Swift 中实现它?
Swift 中的大量 Self
/self
/Type
/type
关键字感觉很模糊,我很难找出正确的解决方案。
解决方案是这样的:
class User {
var name: String
required init(name: String) { self.name = name }
class func named(_ name: String) -> Self {
let instance = Self.init(name: name)
return instance
}
}
以下示例显示一切正常:
class Admin: User {
override class func named(_ name: String) -> Self {
let decoratedName = "~\(name)~"
let instance = Self.init(name: decoratedName)
return instance
}
func ban(user: User) {
print("User \(user.name) banned by \(name)!")
}
}
let user = User.named("John")
let admin = Admin.named("Peter")
admin.ban(user: user) // Yields 'User John banned by ~Peter~!'
所以,你要注意这几个要点:
- 你的 class 必须有一个
required
构造函数(甚至可以没有参数)
- 您应该在方法
Self.
中调用它
- 你的方法应该有
class
访问修饰符
- 你的方法的return类型应该是
-> Self
(注意大写S)
考虑在 Objective-C 中编写的这个静态工厂方法:
@implementation User
+ (instancetype)named:(NSString *)name {
let user = [self new];
user.name = name;
return user;
}
@end
如何在 Swift 中实现它?
Swift 中的大量 Self
/self
/Type
/type
关键字感觉很模糊,我很难找出正确的解决方案。
解决方案是这样的:
class User {
var name: String
required init(name: String) { self.name = name }
class func named(_ name: String) -> Self {
let instance = Self.init(name: name)
return instance
}
}
以下示例显示一切正常:
class Admin: User {
override class func named(_ name: String) -> Self {
let decoratedName = "~\(name)~"
let instance = Self.init(name: decoratedName)
return instance
}
func ban(user: User) {
print("User \(user.name) banned by \(name)!")
}
}
let user = User.named("John")
let admin = Admin.named("Peter")
admin.ban(user: user) // Yields 'User John banned by ~Peter~!'
所以,你要注意这几个要点:
- 你的 class 必须有一个
required
构造函数(甚至可以没有参数) - 您应该在方法
Self.
中调用它 - 你的方法应该有
class
访问修饰符 - 你的方法的return类型应该是
-> Self
(注意大写S)