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)