gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 01:44:22 25 4
gpt4 key购买 nike

这段代码

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

根据您实际尝试做的事情,仅类别可能就足够了吗?

关于Swift 编译错误,子类化 NSValue,使用 super.init(nonretainedObject :),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24455907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com