在 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
提供 alloc
和 init
方法,因此可以预期 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
在 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
提供 alloc
和 init
方法,因此可以预期 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