Swift enum自定义原始类型不能由不同的文字表示

Swift enum自定义原始类型不能由不同的文字表示,swift,enums,Swift,Enums,我正在阅读精彩的文章,他试图演示如何使用SwiftEnums自定义原始值 我对他的代码进行了一番研究,并编写了一个有点做作的示例,以了解具有自定义原始类型的枚举有多健壮 我想知道我是否可以创建一个类型,它的实例可以用作原始值,同时可以通过字符串和整数文本来表达。当我实现ExpressiblebyIntegerLiteral时,String部分没有按我预期的方式工作,我不太清楚为什么 以下是代码(代码后面的问题): 我期望上面的代码产生的是stringTarget和intTarget都被初始化为适

我正在阅读精彩的文章,他试图演示如何使用Swift
Enum
s自定义原始值

我对他的代码进行了一番研究,并编写了一个有点做作的示例,以了解具有自定义原始类型的枚举有多健壮

我想知道我是否可以创建一个类型,它的实例可以用作原始值,同时可以通过
字符串
整数
文本来表达。当我实现
ExpressiblebyIntegerLiteral
时,
String
部分没有按我预期的方式工作,我不太清楚为什么

以下是代码(代码后面的问题):

我期望上面的代码产生的是
stringTarget
intTarget
都被初始化为适当的
Enum
情况,但是
stringTarget
一个结果是
nil

如果删除对
ExpressibleByIntegerLiteral
协议的一致性(以及初始化
intTarget
的相应代码块),则
stringTarget
会按预期自动初始化为
Target.string
大小写

有人能给我解释一下这里发生了什么吗?

解决你的问题 我期望上面的代码产生的是
stringTarget
intTarget
都被初始化为适当的
Enum
情况,但是,stringTarget的结果是
nil

他们不是零。它们是这样的:

这是因为
.content
.resources
案例都不是由字符串明确定义的。正因为如此,它们都采用了
ExpressibleByIntegerLiteral
路线,因此被定义为this

init(integerLiteral:Int){
string=”“//请参阅
整数
}

求整数 使用这种奇特的方法代替
IntValue(rawValue:1)

func IntValue(\uthis:Int)->字符串?{
返回目标(rawValue:0)!=nil?字符串(描述:Target(rawValue:0)!):nil
}

为字符串求解 首先,将枚举与
caseitrable
相一致,如下所示:

enum目标:路径,caseetrable{
接下来,用这个奇特的方法代替
目标(rawValue:“content”)

func-StringValue(uu-this:String)->String{
return Target.allCases.contains{this==String(description:$0)}this:nil
}

弦的真解 现在,我已经删除了一个重要的bug,其中
case foo=“bar”
既可以作为“foo”也可以作为“bar”找到。如果您不想这样做,请使用以下代码:

func-StringValue(uu-this:String)->String{
找到变量:字符串?=nil
_=Target.allCases.filter{
如果让a=Target(rawValue:Path.init(字符串:this,int:0)){
found=字符串(描述:a)
返回此==字符串(描述:a)
}
found=字符串(描述:$0)
返回此==字符串(描述:$0)
}
返回发现
}

枚举的自定义原始值 下面是一个快速教程:

我想知道enum是否可以将它的rawValue与ClosedRange结构一致,就像它可以与String一致一样

enum Foo:ClosedRange{
案例条=1…4
}
显然,这不是一个选项,因为
1…4
不是文字

这似乎有效:

enum Foo:ClosedRange{
case foo=“1…3”
case bar=“1…4”
func overlaps(uwith:Foo)->Bool{return self.rawValue.overlaps(with.rawValue)}
}
扩展名ClosedRange:ExpressibleByStringLiteral{ 公共类型Alias StringLiteralType=字符串 public init(stringLiteral值:String){ 设v=值。拆分(分隔符:“.”) 开关绑定{ 大小写为Int.Type:self=(Int(v[0])!as!Bound)…(Int(v[1])!as!Bound) 默认值:fatalError() } } } 它允许您执行以下操作:

print(Foo.foo.overlaps(Foo.bar))
  • 您可以使用添加更多类型,如
    Double
    String

旁注:我的尝试考虑到了这一点,但我不认为这是可以解决的:

enum Foo:ClosedRange{
case foo=“1…3”
case bar=“1…4”
case bar=“1…04”//重复,但Swift允许。
}

我发现了这项技术:。但这看起来很酷,我要试一试
print(Foo.foo.overlaps(Foo.bar))