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

时间:2014-06-27 15:48:17

标签: swift nsvalue

此代码

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:)必须调用指定的初始化程序,对吗?

1 个答案:

答案 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)
    }
}

根据您实际尝试的内容,仅此类别可能就足够了吗?