Ios 优化级别影响比较枚举
出于优化级别快速的某些原因,我的比较方法会返回额外的3个元素。这是我的代码有问题还是swift 2.0中的错误?问题发生在XCode 7.0和XCode 7.1上(两个不同的Mac)Ios 优化级别影响比较枚举,ios,swift,swift2,Ios,Swift,Swift2,出于优化级别快速的某些原因,我的比较方法会返回额外的3个元素。这是我的代码有问题还是swift 2.0中的错误?问题发生在XCode 7.0和XCode 7.1上(两个不同的Mac) 我一直在玩这个。下面是一个简单的例子: struct Foo { enum Enum { case A case B case C(Int) } } func ==(lhs: Foo.Enum, rhs: Foo.Enum) -> Bool {
我一直在玩这个。下面是一个简单的例子:
struct Foo {
enum Enum {
case A
case B
case C(Int)
}
}
func ==(lhs: Foo.Enum, rhs: Foo.Enum) -> Bool {
print("comparing \(lhs) == \(rhs) -> ", terminator: "")
switch(lhs, rhs) {
case (.A, .A):
return true
case (.B,.B):
return true
default:
return false
}
}
func test() {
print( Foo.Enum.A == .B)
print([ Foo.Enum.A ][0] == .B)
print([ Foo.Enum.A ].first! == .B)
for itemType in [ Foo.Enum.A ] { print(itemType == .B) }
}
test()
In-Onone构建此函数将打印预期值的四倍。在优化版本中,它打印
comparing A == B -> false
comparing A == B -> false
comparing A == B -> true
comparing A == B -> true
当出现以下情况时,错误消失:
- 测试在外部文件作用域中执行(不在函数中)
- 使用普通函数代替运算符
==
- 枚举未嵌套在其他类型中
- 案例C或相关类型被删除
语句插入到print
案例中开关
我一直在用Xcode 7.1进行测试。这个bug肯定应该提交到bugreport.apple.com你更新到Xcode 7.1了吗?它在不同的Xcode版本上进行了测试,结果是一样的。我问这个问题是因为它看起来与此相关:很可能这个bug的一部分还没有修复。枚举是以高度优化的方式存储的,这可能会产生副作用。我做了一些实验,我认为这与优化有关,正如你所说的,例如,如果我将在覆盖的运算符代码中的
返回true/false
之前添加print(“”
),它将正确工作。这是一个极好的错误;请向苹果公司报告。
comparing A == B -> false
comparing A == B -> false
comparing A == B -> true
comparing A == B -> true