gpt4 book ai didi

swift - 在不使用关联类型的情况下,您能否将协议(protocol)中的变量限制为原始类型为 String 的 RawRepresentables?

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

我有一个案例,我试图定义一个接受对象数组的函数,要求每个对象必须定义一个基于字符串的枚举,称为“命令”。

下面是一个示例,说明如果您使用关联类型,您将如何做到这一点:

protocol CommandSetProtocol {

associatedtype Command : RawRepresentable where Command.RawValue == String

var commands:[Command] { get }
}

class FooCommands : CommandSetProtocol {

enum Command : String {
case commandA = "Command A"
case commandB = "Command B"
}

let commands = [
Command.commandA,
Command.commandB
]
}

class LaaCommands : CommandSetProtocol {

enum Command : String {
case commandC = "Command C"
case commandD = "Command D"
}

let commands = [
Command.commandC,
Command.commandD
]
}

问题是你不能这样做,因为关联类型:

var commandSets:[CommandSetProtocol.Type] = [
FooCommands.self,
LaaCommands.self
]

注意:我正试图阻止某人这样做,这应该会导致编译失败,因为 Raw 类型不是字符串。

class BadCommands : CommandSetProtocol {

enum Command : Int {
case commandE = 1
case commandF = 2
}

let commands = [
Command.commandE,
Command.commandF
]
}

如何实现这个(或类似的)?

最佳答案

消除问题中所有的转移注意力,你实际上只是在指出一个众所周知的事实,即这种事情是合法的:

protocol P {}
class A:P {}
class B:P {}

let arr : [P] = [A(), B()]

...但是这种事情不是:

protocol P {associatedtype Assoc}
class A:P {typealias Assoc=String}
class B:P {typealias Assoc=String}

let arr : [P] = [A(), B()]

问题是您碰到了“只能用作通用约束”的墙。这堵墙将在 Swift 的 future 版本中被拆除,但在那之前,制作该数组的方法是使用类型删除

关于swift - 在不使用关联类型的情况下,您能否将协议(protocol)中的变量限制为原始类型为 String 的 RawRepresentables?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48650701/

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