让我们考虑以下工作代码
protocol CanFly { }
protocol Container {
associatedtype ContentType
var value: ContentType? { get }
}
class Box<V>: Container {
var value: V?
}
let box = Box<CanFly>()
box.value // <- has type `CanFly?`
Box
在这里接受协议作为泛型类型,不是吗?
现在,我想做一个“小”更改,我在Box value
中创建weak
属性
class Box<V>: Container {
weak var value: V?
}
当然会出现此错误
class Box<V>: Container {
weak var value: V? // 'weak' must not be applied to non-class-bound 'V'; consider adding a protocol conformance that has a class bound
}
我尝试将其约束为V
来修复它AnyObject
class Box<V:AnyObject>: Container {
weak var value: V?
}
我得到这个错误?
let box = Box<CanFly>() // 'Box' requires that 'CanFly' be a class type
这里的问题是,由于我定义了V:AnyObject
,所以我不能再将协议CanFly
用作Box
的通用类型。
我想要
Box#value
属性设置为weak
我该怎么做?
我正在寻找类似的东西
class Box<V:ProtocolForClassOnly>: Container {
weak var value: V?
}
P.S。我能找到的关于StackOverflow的最接近的问题是this one,但不幸的是并没有帮助我。
答案 0 :(得分:0)
因此限制您的CanFly协议键入AnyObject:
protocol CanFly: AnyObject { }
protocol Container {
associatedtype ContentType
var value: ContentType? { get }
}
class Box<V>: Container {
var value: V?
}
然后您的代码有效:
func foo() {
let box = Box<CanFly>()
print(type(of:box.value))
}