swift - 实现枚举 ForwardIndexType

标签 swift enums

我一直在努力正确实现 ForwardIndexType枚举的协议(protocol),特别是最终案例的处理(即没有后继者的最后一项)。 Swift 语言书中并没有真正涵盖该协议(protocol)。

这是一个简单的例子

enum ThreeWords : Int, ForwardIndexType {
    case one=1, two, three

    func successor() ->ThreeWords {
            return ThreeWords(rawValue:self.rawValue + 1)!
    }
}

successor()函数将返回下一个枚举器值,但最后一个元素除外,它会因异常而失败,因为 .three 之后没有值

ForwardTypeProtocol不允许 successor()返回一个条件值,所以似乎没有办法表明没有后继者。

现在在 for 循环中使用它来迭代枚举的所有可能值的封闭范围,最终情况会遇到问题:

for word in ThreeWords.one...ThreeWords.three {
    print("   \(word.rawValue)")
}
println()

//Crashes with the error:

fatal error: unexpectedly found nil while unwrapping an Optional value

Swift 莫名其妙地调用了 successor()在执行 for 循环中的语句之前,范围结束值的函数。如果范围保持半开 ThreeWords.one..<ThreeWords.three然后代码正确执行,打印1 2

如果我修改后继函数,使其不会尝试创建大于 .three 的值像这样

   func successor() ->ThreeWords {
        if self == .three {
            return .three
        } else {
            return ThreeWords(rawValue:self.rawValue + 1)!
        }
    }

然后 for 循环没有崩溃,但它也错过了最后一次迭代,打印结果就好像范围是半开的一样 1 2

我的结论是swift的for循环迭代有bug;它不应该调用 successor()在封闭范围的结束值上。其次,ForwardIndexType应该能够返回一个可选的,能够表明某个值没有后继者。

有没有人在这个协议(protocol)上取得了更大的成功?

最佳答案

确实,successor 似乎将在最后一个值上被调用。

您不妨file a bug ,但要解决此问题,您可以简单地添加一个哨兵值作为继任者。

关于swift - 实现枚举 ForwardIndexType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26686982/

相关文章:

ios - Swiftui 导航底线和阴影删除,不改变导航栏颜色

swift - Alamofire 参数编码中的 POST 请求返回 GET 响应

swift - Sprite 位置没有更新到它被移动到的位置

swift - 将 TableView 嵌套到分组 TableView 中

ios - 限制和缩放 UITextField 中文本的大小

c# - 如何从 [Flag] 枚举属性中检索值?

node.js - 类验证器不区分大小写的枚举验证?

java - org.hibernate.InstantiationException : No default constructor for entity: com. 域.AnomalieAck

c++ - 如何在C++中将枚举插入另一个枚举

python - 自定义 Django 字段不从查询返回 Enum 实例