gpt4 book ai didi

swift - 'Box' 要求 'CanFly' 是类类型

转载 作者:行者123 更新时间:2023-11-28 07:24:11 27 4
gpt4 key购买 nike

背景

让我们考虑以下工作代码

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?`

Here Box accepts a protocol as generic type, beautiful isn't it?

事情变得更难了

现在我想做一个“小”的改变,我将 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,所以我不能再使用协议(protocol) CanFly 作为 Box 的通用类型。

问题

我要

  1. 能够将协议(protocol)用作 Box 的通用类型
  2. AND Box#value 属性

我该怎么做?

最后的考虑

我正在寻找这样的东西

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

P.S. The closest question on StackOverflow I could find is this one but unfortunately hasn't helped me.

最佳答案

因此限制您的 CanFly 协议(protocol)类型为 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))
}

关于swift - 'Box' 要求 'CanFly' 是类类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57060143/

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