在 Swift 中动态创建对象

Create objects dynamically in Swift

在 Objective-C 我有一个类别:

@implementation NSObject (Entity)
+ (instancetype)entity{
    Class cl = self.class;
    NSObject *obj = [[cl alloc] init];

    return obj;
}
@end

假设有 classes A 和 B:

@interface A : NSObject
@end

@interface B : NSObject
@end

然后我可以使用静态 entity 方法创建如下对象:

NSObject *o = [NSObject entity]; // type of NSObject
A *a = [A entity];               // type of A
B *b = [B entity];               // type of B

如何在 Swift 中写入该类别?我知道可以通过了解 let s = NSString.self; var str = s.init() 这样的类型来创建一个对象,但在这里我不知道 class,它应该是 self.self 之类的东西,它没有任何意义,也没有'肯定没用。

提前致谢

let s = NSString.self;
var str = s.init();

如果您需要 class,只需:

print(s) // "NSString"

s 的类型为 "NSString.Type" 它代表对象 class;

如果您需要对象的 class 我认为您正在搜索 "dynamicType":

let object = "toto"
let t = object.dynamicType // String.Type

var newObject = t.init("toto");

正如我在评论中提到的,原因是 Swift 中没有基数 class。您仍然可以通过实现自己的基础 class 或通过 subclassing NSObject.

来实现
class A : NSObject {}
class B : NSObject {}

extension NSObject {
    class func entity() -> Self {
        return self.init()
    }
}

A.entity()
B.entity()

NSObject.entity()

正如其他人所提到的,重点是 Objective-C 为所有 class 提供基础 class,而 Swift 则没有。 obj-C 中的 NSObject 提供 allocinit 方法,因此可以预期 NSObject 的后代将实现或继承这些方法,因此您可以使用快捷方式-您在问题中提到的类别。

在Swift中没有基础classes,因此你无法知道哪个class(或其他类型)提供了哪些初始化器。无论哪种方式,您都必须为您的目的指定它们,我认为协议是最好的方式。

例如考虑一下:

protocol DefaultInstantiatable {
    init()
}

extension DefaultInstantiatable {
    static func entity() -> Self {
        return Self()
    }
}

如果您的类型采用 DefaultInstantiatable 协议,那么您可以使用如下子句:

struct Foo: DefaultInstantiatable {
    init() { }
}

class Bar: DefaultInstantiatable {
    required init() { }
}

let foo = Foo.entity()  // Creates an instance of Foo structure
let bar = Bar.entity()  // Creates an instance of Bar object