【问题标题】: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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      • 1970-01-01
      相关资源
      最近更新 更多