gpt4 book ai didi

ios - 如何定义一个符合协议(protocol)的对象数组?

转载 作者:搜寻专家 更新时间:2023-10-30 22:15:32 26 4
gpt4 key购买 nike

给定:

protocol MyProtocol {
typealias T
var abc: T { get }
}

还有一个实现 MyProtocol 的类:

class XYZ: MyProtocol {
typealias T = SomeObject
var abc: T { /* Implementation */ }
}

如何定义符合 MyProtocol 的对象数组?

var list = [MyProtocol]()

给出(连同大量 SourceKit 崩溃)以下错误:

Protocol 'MyProtocol' can only be used as a generic constraint because it has Self or associated type requirements

尽管类型别名实际上是在 MyProtocol 中定义的。

有没有办法让对象列表符合协议(protocol)并具有通用约束?

最佳答案

问题是关于使用协议(protocol)的泛型对应物,类型别名。这听起来很奇怪,但是如果你定义了一个类型别名,你就不能将协议(protocol)作为一个类型来使用,这意味着你不能声明该协议(protocol)类型的变量、函数参数等。并且你不能将它用作一个类的泛型对象数组。

如错误所述,您可以将其用作通用约束(如 class Test<T:ProtocolWithAlias> )。

为了证明这一点,只需从您的协议(protocol)中删除类型别名(注意,这只是为了证明,它不是解决方案):

protocol MyProtocol {
var abc: Int { get }
}

并相应地修改示例代码的其余部分:

class XYZ: MyProtocol {
var abc: Int { return 32 }
}

var list = [MyProtocol]()

您会发现它有效。

您可能对如何解决这个问题更感兴趣。我想不出任何优雅的解决方案,只有以下 2 个:

  • 从协议(protocol)中删除类型别名并替换TAnyObject (丑陋的解决方案!!)
  • 将协议(protocol)变成一个类(但这不是适用于所有情况的解决方案)

但正如您可能会争辩的那样,我不喜欢它们中的任何一个。我能提供的唯一建议是重新考虑您的设计并弄清楚您是否可以使用不同的方式(即不使用类型别名协议(protocol))来实现相同的结果。

关于ios - 如何定义一个符合协议(protocol)的对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26542443/

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