Swift编译错误,子类化NSValue,使用super.init(nonretainedObject:)

Swift编译错误,子类化NSValue,使用super.init(nonretainedObject:),swift,nsvalue,Swift,Nsvalue,此代码 class ID<T: AnyObject> : NSValue { init(baseObject: T) { super.init(nonretainedObject: baseObject) } } 我怎样才能摆脱这个 我想到的事情 我认为错误可能是因为NSValue初始值设定项具有AnyObject?类型(注意:后缀?)。我尝试了各种风格的铸造和[?!]后固定,但没有任何效果 另外,大概NSValue(nonretainedObjec

此代码

class ID<T: AnyObject> : NSValue {
    init(baseObject: T) {
        super.init(nonretainedObject: baseObject)
    }
}
我怎样才能摆脱这个

我想到的事情 我认为错误可能是因为
NSValue
初始值设定项具有
AnyObject?
类型(注意:后缀
)。我尝试了各种风格的铸造和
[?!]
后固定,但没有任何效果

另外,大概
NSValue(nonretainedObject:)
必须调用指定的初始值设定项,对吗?

NSValue(nonretainedObject:)
不是指定的初始值设定项。NSValue参考中列出的唯一初始值设定项(以及指定的初始值设定项)是
NSValue(值:CConstVoidPointer,withObjCType类型:CString)

其他构造函数都是从类帮助器方法派生的方便构造函数

您可以尝试:

init(baseObject: T) {
    super.init(bytes:&baseObject, withObjCType:"^v")
}
“^v”是使用valueWithNonRetained….创建的NSValue返回的类型字符串

不幸的是,我没有找到合适的方法将
baseObject
作为指针传递

除此之外,我能想到的最好办法是包装NSValue,而不是将其子类化:

class ID<T:AnyObject> {
    let wrapped:NSValue

    init(baseObject:T) {
        wrapped = NSValue(nonretainedObject:baseObject)
    }
}
类ID{
让包装:NSValue
init(baseObject:T){
wrapped=NSValue(非恢复对象:baseObject)
}
}
终于找到了工作,但有点难看,基本上添加一个方便的构造函数来包装非返回对象构造函数,然后在子类中使用它:

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)
    }
}
扩展值{
便利初始化(未恢复:T){
self.init(未恢复对象:未恢复)
}
}
类ID:NSValue{
便利初始化(未恢复:T){
self.init(未恢复:未恢复)
}
}

取决于您实际想做什么,仅使用类别可能就足够了?

目前,我在中看到了
init(nonretainedObject:)
。这些文档似乎不清楚它们是否引用了
+value/-init
方法。不管怎样,您已经为一个好的解决方法指明了方向。是的,这些文档非常明确,
init(bytes-value:CConstVoidPointer,objCType-type:Cstring)
是指定的初始值设定项。现在,如果你能想出如何在你的golden:)IIUC中传递baseObject,那么指定的初始值设定项是什么并不重要,只要你链接到它。我认为所有的
NSValue
s便利初始化器都应该这样做,对吗?最终必须从子类中调用(a)指定的初始化器。为了方便起见,在标记非指定初始值设定项的初始值设定项时也有一些限制,但我必须查看具体的规则。基本上,编译器会告诉您将其标记为“便利”,您会这样做:)
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)
    }
}