我有一段java代码,我想转换成swift,但找不到与java的枚举接口相当的swift,任何帮助都将不胜感激。
Java Enumeration
在Java语言中,Enumeration是一个允许一次访问一个元素序列的类。调用hasMoreElements()将返回一个布尔值,指示是否存在另一个元素,而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是否包含等价的对象?
发布于 2016-10-27 02:52:42
是的,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,开发人员应该在每次调用next()之前调用hasMoreElements(),以确保next()不会试图访问不存在的值。因此,基本上,hasMoreElements()执行安全检查,而next()只是尝试给出下一个值。如果"next value“不存在,Java就会从next()抛出异常。
Swift处理事情的方式有点不同。相反,安全检查是在next()中完成的,该函数还会返回值(如果存在)。因此,如果安全检查失败,则返回nil;否则,获取并返回下一个值。因为next()返回Element? ('Optional')而不是Element,所以我们可以对返回值使用while let。while let创建了一个只有在next()不为nil时才为真的条件。此外,当满足此条件时,返回值将自动添加到可在循环范围内使用的非可选类型的常量中。
这意味着在Swift中,理论上您可以在序列耗尽后继续调用next()多次,但您将继续得到nil。Swift在很大程度上更喜欢在这样的地方返回可选函数,而不是抛出错误,这通常是为出错而保留的。事实上,直到Swift 2.0,错误才能在Swift中被抛出和捕获。
https://stackoverflow.com/questions/40269714
复制相似问题