Ios 优化级别影响比较枚举

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 {

出于优化级别快速的某些原因,我的比较方法会返回额外的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 {
    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