“框”要求“ CanFly”为类类型

时间:2019-07-16 14:55:52

标签: swift generics protocols swift5 associated-types

背景

让我们考虑以下工作代码

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的通用类型。

问题

我想要

  1. 能够将协议用作Box的通用类型
  2. Box#value属性设置为weak

我该怎么做?

最终注意事项

我正在寻找类似的东西

class Box<V:ProtocolForClassOnly>: Container {
    weak var value: V?
}
  

P.S。我能找到的关于StackOverflow的最接近的问题是this one,但不幸的是并没有帮助我。

1 个答案:

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