swift中等效的java.util.enumeration

时间:2016-10-26 18:31:12

标签: java swift

我在java中有一段代码要转换为swift,但是找不到与java的Enumeration接口相当的快捷方式,任何帮助都将受到高度赞赏。

Java Enumeration

在Java中,Enumeration是一个允许一次访问一个元素序列的类。调用hasMoreElements()会返回一个bool,指示是否有另一个元素,nextElement()移动到序列中的下一个项目并返回它。

我的Java代码

import java.util.Enumeration;

private Hashtable<String, Marker> mMarkers;
final Enumeration<String> refs = mMarkers.keys();
    while (refs.hasMoreElements()) {
        final String ref = refs.nextElement();
    }

问题

Swift是否包含等效对象?

1 个答案:

答案 0 :(得分:1)

是的,Swift包含一个等价的,但是以真正的Swift方式,核心功能采用Swift标准库中定义的协议的形式,然后由标准库中的其他协议和对象实现。

This Swift documentation为您提供了您需要了解的所有信息。

基本上,IteratorProtocol定义了一个非常类似于Java Enumeration的界面。然后,您可以从集合中获取特殊的迭代器对象,并以相同的方式使用它。

样品

(无需导入)

private var mMarkers: Dictionary<String, Marker>
let refsIterator = mMarkers.keys.makeIterator()
while let ref = refsIterator.next() {
    // do something with ref
}

但是,大多数情况下,除非您需要高度自定义,否则您只需使用for-in循环:

private var mMarkers: Dictionary<String, Marker>
for ref in mMarkers.keys {
    // do something with ref
}

Java和Swift实现之间的区别

无论我们使用Java还是Swift,在我们尝试使用该值之前确保存在下一个值非常重要。

对于Java Enumerator,开发人员应在每次调用hasMoreElements()之前致电next(),以确保next()不要试图访问不存在的值。基本上,hasMoreElements()执行安全检查,而next()只是尝试为您提供下一个值。如果&#34;下一个值&#34;如果不存在,Java会从next()引发异常。

Swift处理事情有点不同。安全检查是在next()中完成的,该函数同样返回一个值(如果存在)。因此,如果安全检查失败,则返回nil;否则,将获取并返回下一个值。由于next()返回Element?(&#39;可选&#39;)而不是Element,我们可以对返回的值使用while letwhile let创建的条件仅在next()不是nil时才为真。此外,当满足此条件时,返回的值将自动添加到具有非可选类型的常量中,该类型可以在循环范围内使用。

这意味着在Swift中,理论上你可以在序列耗尽后继续多次调用next(),但是你将继续获得nil。 Swift在很大程度上更喜欢在这样的地方返回选项,而不是抛出错误,这些错误通常是出错的。实际上,直到Swift 2.0,错误甚至可能被抛出并被Swift捕获。