优化级别影响比较枚举
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 提交
【讨论】:
以上是关于优化级别影响比较枚举的主要内容,如果未能解决你的问题,请参考以下文章