优化级别影响比较枚举

Posted

技术标签:

【中文标题】优化级别影响比较枚举【英文标题】:Optimization level affects comparing enums 【发布时间】:2015-10-30 14:40:57 【问题描述】:

由于优化级别快速的某些原因,我的比较方法返回了额外的 3 个元素。是我的代码有问题还是 swift 2.0 中的错误? XCode 7.0 和 XCode 7.1(2 个不同的 Mac)上出现问题。

func ==(lhs: ViewController.ItemType, rhs: ViewController.ItemType) -> Bool 
    // For some reasons for different types e.g. .CType and .AType it returns true
    switch(lhs, rhs) 
    case (.AType, .AType):
        return true
    case (let .BType(type1), let .BType(type2)):
        return type1 == type2
    case (.CType,.CType):
        return true
    case (.DType, .DType):
        return true
    case (.EType,.EType):
        return true
    default:
        return false
    


class ViewController: UIViewController 
    enum ItemType 
        case AType
        case BType(Int)
        case CType
        case DType
        case EType
    

    override func viewDidLoad() 
        super.viewDidLoad()
        let array:[ItemType] = [.AType, .BType(10), .CType, .DType, .EType]
        let array2 = array.filter  (itemType:ItemType) -> Bool in
            return itemType == .CType
        

        // Prints 1 on [-ONone] optimization and 4 for [-OFast] optimization.
        print("Items \(array2.count):\n\(array2)")
    

【问题讨论】:

你更新到 Xcode 7.1 了吗? 在不同的 XCode 版本上进行了测试,结果相同。 我问是因为它看起来与此相关:***.com/questions/32533909/… 很可能这个错误的一部分仍未修复。枚举以高度优化的方式存储,这可能会产生副作用。 我做了一些实验,我认为它与你所说的优化有关,例如如果我在覆盖的操作符代码中在return true/false 之前添加print("") 可以正常工作。 这是一个极好的错误;请向 Apple 报告。 【参考方案1】:

我一直在玩这个。这是一个最小的例子:

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()

在 -Onone 构建这将打印预期的四次 true。在优化的构建中,它会打印...

comparing A == B -> false
comparing A == B -> false
comparing A == B -> true
comparing A == B -> true

该错误在以下情况下消失:

测试在外部文件范围内执行(而不是在函数中) 使用普通函数代替运算符== 枚举未嵌套在其他类型中 case C 或关联类型已删除 print 语句插入到 switch 案例中

我一直在使用 Xcode 7.1 进行测试。这个错误绝对应该在 bugreport.apple.com 提交

【讨论】:

以上是关于优化级别影响比较枚举的主要内容,如果未能解决你的问题,请参考以下文章

logging模块进阶2

无论如何,php枚举有不同的级别吗? [复制]

记一次Maven优化过程,减少到分钟级别

记一次Maven优化过程,减少到分钟级别

记一次Maven优化过程,减少到分钟级别

Linux下内核优化