【问题标题】:Inheritable static factory method in Swift classSwift 类中的可继承静态工厂方法
【发布时间】:2020-10-19 09:59:54
【问题描述】:
考虑一下这个用 Objective-C 编写的静态工厂方法:
@implementation User
+ (instancetype)named:(NSString *)name {
let user = [self new];
user.name = name;
return user;
}
@end
如何在 Swift 中实现它?
Swift 中大量的 Self/self/Type/type 关键字让人感觉很模糊,我很难找出正确的解决方案。
【问题讨论】:
标签:
swift
inheritance
static-methods
factory-method
【解决方案1】:
解决方案是这样的:
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~!'
所以,你应该注意这些关键点:
- 你的类必须有一个
required 构造函数(甚至可能没有参数)
- 你应该在你的方法中通过
Self. 调用它
- 你的方法应该有
class访问修饰符
- 你的方法的返回类型应该是
-> Self(注意大写的S)