这段代码
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:)
必须调用指定的初始化程序,对吗?
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)
}
}
根据您实际尝试进行的分类,可能就足够了?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句