我在java中有一段代码要转换为swift,但是找不到与java的Enumeration接口相当的快捷方式,任何帮助都将受到高度赞赏。
Enumeration
在Java中,Enumeration
是一个允许一次访问一个元素序列的类。调用hasMoreElements()
会返回一个bool,指示是否有另一个元素,nextElement()
移动到序列中的下一个项目并返回它。
import java.util.Enumeration;
private Hashtable<String, Marker> mMarkers;
final Enumeration<String> refs = mMarkers.keys();
while (refs.hasMoreElements()) {
final String ref = refs.nextElement();
}
Swift是否包含等效对象?
答案 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 Enumerator
,开发人员应在每次调用hasMoreElements()
之前致电next()
,以确保next()
不要试图访问不存在的值。基本上,hasMoreElements()
执行安全检查,而next()
只是尝试为您提供下一个值。如果&#34;下一个值&#34;如果不存在,Java会从next()
引发异常。
Swift处理事情有点不同。安全检查是在next()
中完成的,该函数同样返回一个值(如果存在)。因此,如果安全检查失败,则返回nil
;否则,将获取并返回下一个值。由于next()
返回Element?
(&#39;可选&#39;)而不是Element
,我们可以对返回的值使用while let
。 while let
创建的条件仅在next()
不是nil
时才为真。此外,当满足此条件时,返回的值将自动添加到具有非可选类型的常量中,该类型可以在循环范围内使用。
这意味着在Swift中,理论上你可以在序列耗尽后继续多次调用next()
,但是你将继续获得nil
。 Swift在很大程度上更喜欢在这样的地方返回选项,而不是抛出错误,这些错误通常是出错的。实际上,直到Swift 2.0,错误甚至可能被抛出并被Swift捕获。