Vla*_*lad 7 generics nsnotificationcenter swift
无法使用Generic payload对象创建NSNotification的子类.获取运行时错误或编译错误(请参阅下面的代码中的注释).甚至可以使用Swift 2.1吗?任何想法都赞赏.谢谢!
运行时错误,因为NSNotification是抽象类(类集群).
编译错误,因为应该使用指定的初始化程序.
public class Notification<T: Any>: NSNotification {
private var _name: String
private var _object: AnyObject?
private var _payload: T?
public override var name: String {
return _name
}
public override var object: AnyObject? {
return _object
}
public var payload: T? {
return _payload
}
/// Always nil. Use payload
public override var userInfo: [NSObject : AnyObject]? {
return nil
}
/// Change to false to "swap" implementation
#if true
init(name: String, object: AnyObject? = nil, payload: T? = nil) {
_name = name
_object = object
_payload = payload
/*
Runtime error:
Terminating app due to uncaught exception
'NSInvalidArgumentException', reason:
'*** initialization method -initWithName:object:userInfo:
cannot be sent to an abstract object of class
_TtGC14__lldb_expr_1612NotificationSS_:
Create a concrete instance!'
*/
super.init(name: name, object: object, userInfo: nil)
}
#else
convenience init(name: String, object: AnyObject? = nil, payload: T? = nil) {
self.init()
_name = name
_object = object
_payload = payload
}
init() {
/// compiler error:
/// must call a designated initializer of the superclass
/// But using designated initializer cause runtime error listed above.
super.init()
}
#endif
}
let n = Notification<String>(name: "xyz", payload: "Hello")
Run Code Online (Sandbox Code Playgroud)
从文档中,强调我的:
NSNotification除了通知名称,对象和字典之外,您还可以子类化以包含信息.这些额外数据必须在通知者和观察者之间达成一致.
NSNotification是一个没有实例变量的类集群.因此,你必须继承NSNotification和覆盖原始的方法name,object和userInfo.您可以选择任何您喜欢的指定初始化程序,但请确保您的初始化程序不会调用[super init].NSNotification并不意味着直接实例化,它的init方法引发了异常.
NSNotification现在没有办法从Swift代码中获得子类,因为Swift没有"uninitializable类"的概念,并要求所有子类调用它们的超类init(在这种情况下,这是错误的事情).
您必须在Objective-C中编写子类并将其桥接到Swift代码中.
不幸的是,即使您可以声明Objective-C类是通用的,该信息也会在桥接过程中丢失.来自文档:
除了这些Foundation集合类之外,Swift还忽略了Objective-C轻量级泛型.使用轻量级泛型的任何其他类型都会导入到Swift中,就好像它们是未参数化的一样.
:(
| 归档时间: |
|
| 查看次数: |
385 次 |
| 最近记录: |