此代码
class ID<T: AnyObject> : NSValue {
init(baseObject: T) {
super.init(nonretainedObject: baseObject)
}
}
给出了这个编译错误:
error: must call a designated initializer of the superclass 'NSValue'
super.init(nonretainedObject: baseObject)
^
如何摆脱这种情况?
我认为错误可能是因为NSValue
初始值设定项具有AnyObject?
类型(注意:postfix ?
)。我尝试了各种各样的铸造和[?!]
后缀,它没有修复任何东西。
另外,大概NSValue(nonretainedObject:)
必须调用指定的初始化程序,对吗?
答案 0 :(得分:2)
NSValue(nonretainedObject:)
不是指定的初始值设定项。 NSValue引用中列出的唯一初始化程序(因此指定的初始化程序)是NSValue(value:CConstVoidPointer, withObjCType type:CString)
其他构造函数都是从类辅助方法派生的便捷构造函数。
您可以尝试:
init(baseObject: T) {
super.init(bytes:&baseObject, withObjCType:"^v")
}
“^ v”是由valueWithNonRetained创建的NSValue返回的类型字符串....
不幸的是,我没有想出一个合适的方法来将baseObject
作为CConstVoidPointer传递。
除此之外,我能想到的最好的事情是包装NSValue而不是子类化它:
class ID<T:AnyObject> {
let wrapped:NSValue
init(baseObject:T) {
wrapped = NSValue(nonretainedObject:baseObject)
}
}
终于有了一些工作,但它有点难看,基本上添加了一个包含nonretainedObject构造函数的便利构造函数,然后在你的子类中使用它:
extension NSValue {
convenience init<T:AnyObject>(unretained:T) {
self.init(nonretainedObject:unretained)
}
}
class ID<T>:NSValue {
convenience init<T:AnyObject>(unretained:T) {
self.init(unretained:unretained)
}
}
根据您实际尝试的内容,仅此类别可能就足够了吗?