Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift类中的可继承静态工厂方法_Swift_Inheritance_Static Methods_Factory Method - Fatal编程技术网

Swift类中的可继承静态工厂方法

Swift类中的可继承静态工厂方法,swift,inheritance,static-methods,factory-method,Swift,Inheritance,Static Methods,Factory Method,考虑使用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 {

考虑使用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~!'
因此,您应该注意以下几点:

  • 类必须具有
    必需的
    构造函数(甚至可能没有参数)
  • 您应该在方法内部的
    Self.
    上调用它
  • 你的方法应该有
    class
    access修饰符
  • 方法的返回类型应该是
    ->Self
    (注意大写字母s)