NSValue(nonretainedObject:)
isn't a designated initializer. The only initializer listed in the NSValue reference (and hence the designated initializer) is NSValue(value:CConstVoidPointer, withObjCType type:CString)
The other constructors are all convenience constructors derived from class helper methods.
You might try:
init(baseObject: T) {
super.init(bytes:&baseObject, withObjCType:"^v")
}
"^v" is the type string returned by an NSValue created with valueWithNonRetained....
Unfortunately, I'm not coming up with an appropriate way to pass baseObject
as a CConstVoidPointer.
Barring that, the best thing I can come up with is to wrap NSValue instead of subclassing it:
class ID<T:AnyObject> {
let wrapped:NSValue
init(baseObject:T) {
wrapped = NSValue(nonretainedObject:baseObject)
}
}
Finally got something to work, but it's a little bit ugly, basically add a convenience constructor that wraps the nonretainedObject constructor and then use that in your subclass:
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)
}
}
Depending on what you're actually trying to do the category alone might be sufficient?
init(nonretainedObject:)
in these Apple docs . The docs seem confused on whether they are referring to+value/-init
methods. Regardless, you've pointed the way to a good workaround. – Schappe