这段代码
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?
type (请注意:后缀 ?
)。我尝试了各种风格的铸造和[?!]
在一些地方进行后固定,但它没有修复任何东西。
另外,大概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)
}
}
终于得到了一些东西,但它有点难看,基本上添加一个方便的构造函数来包装非保留的 Object 构造函数,然后在您的子类中使用它:
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)
}
}
根据您实际想要做的事情,单独分类可能就足够了?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)