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

2024-04-16

这段代码

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(使用前将#替换为@)

Swift 编译错误,子类化 NSValue,使用 super.init(nonretainedObject:) 的相关文章

随机推荐