首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >swift中的java.util.enumeration等效项

swift中的java.util.enumeration等效项
EN

Stack Overflow用户
提问于 2016-10-27 02:31:12
回答 1查看 105关注 0票数 1

我有一段java代码,我想转换成swift,但找不到与java的枚举接口相当的swift,任何帮助都将不胜感激。

Java Enumeration

在Java语言中,Enumeration是一个允许一次访问一个元素序列的类。调用hasMoreElements()将返回一个布尔值,指示是否存在另一个元素,而nextElement()将移至序列中的下一项并返回它。

我的Java代码

代码语言:javascript
复制
import java.util.Enumeration;

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

问题

Swift是否包含等价的对象?

EN

回答 1

Stack Overflow用户

发布于 2016-10-27 02:52:42

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

This Swift documentation为您提供了您需要知道的一切。

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

示例

(不需要导入)

代码语言:javascript
复制
private var mMarkers: Dictionary<String, Marker>
let refsIterator = mMarkers.keys.makeIterator()
while let ref = refsIterator.next() {
    // do something with ref
}

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

代码语言:javascript
复制
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 letwhile let创建了一个只有在next()不为nil时才为真的条件。此外,当满足此条件时,返回值将自动添加到可在循环范围内使用的非可选类型的常量中。

这意味着在Swift中,理论上您可以在序列耗尽后继续调用next()多次,但您将继续得到nil。Swift在很大程度上更喜欢在这样的地方返回可选函数,而不是抛出错误,这通常是为出错而保留的。事实上,直到Swift 2.0,错误才能在Swift中被抛出和捕获。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40269714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档