首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift中的NSFastEnumeration

Swift中的NSFastEnumeration
EN

Stack Overflow用户
提问于 2014-09-11 13:06:23
回答 6查看 6.6K关注 0票数 16

我正在尝试将object项目转换为for,但我无法找到如何将NSFastEnumeration用于符合NSFastEnumeration的类的对象。

下面是ObjC中的代码:

代码语言:javascript
复制
//  get the decode results
id<NSFastEnumeration> results = [info objectForKey: ZBarReaderControllerResults];

ZBarSymbol *symbol = nil;
for(symbol in results)
    // just grab the first barcode
    break;

到目前为止,我试图找到如何做到这一点,但这似乎不起作用,下面是快速代码:

代码语言:javascript
复制
var results: ZBarSymbolSet = infoDictionary?.objectForKey(ZBarReaderControllerResults) as ZBarSymbolSet

    var symbol : ZBarSymbol? = nil;

    for symbol in results
    {    //just grab first barcode
        break;
    }

错误出现在条件- "ZBarSymbolSet“没有一个名为”生成器“的成员。

我做错了什么?

这是屏幕截图

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-09-16 15:38:00

在浏览了一下快速框架文件之后,我终于找到了一个名为NSFastGenerator的不错的类。NSSet和朋友们似乎在使用相同的Generator

对于ZBarSymbolSet,下面是如何扩展它以支持for-in循环:

代码语言:javascript
复制
extension ZBarSymbolSet: SequenceType {
    public func generate() -> NSFastGenerator {
        return NSFastGenerator(self)
    }
}

更新:看起来像是SWIFT2.0的协议扩展,为我们解决了这个问题!

票数 23
EN

Stack Overflow用户

发布于 2014-09-11 14:12:37

您定义的类ZBarSymbolSet需要实现Swift SequenceType接口,以便在for <identifier> in <sequence>语法中使用。SequenceType接口是

代码语言:javascript
复制
protocol SequenceType : _Sequence_Type {
    typealias Generator : GeneratorType
    func generate() -> Generator
}

因此,您可以在错误消息中看到对Generator的提及。

也是在语法上:

代码语言:javascript
复制
for <identifier> in <sequence> {
  <statements>
}

<identifer>只适用于<statements>。因此,symbolif中的第二次使用将超出范围并产生错误。一个恰当的成语是:

代码语言:javascript
复制
var symbolFound : ZBarSymbol?

for symbol in result {
  symbolFound = symbol
  break
}

if symbolFound ...

当然,但是ZBarSymbolSet实现SequenceType的时间也会用subscript实现CollectionType,因此整个“查找第一个元素”代码将是var symbol = result[0]

票数 3
EN

Stack Overflow用户

发布于 2016-10-14 17:34:45

以下是约翰·埃斯特罗皮亚对Swift 3的回答:

代码语言:javascript
复制
extension ZBarSymbolSet: Sequence {

    public typealias Iterator = NSFastEnumerationIterator

    public func makeIterator() -> NSFastEnumerationIterator {
        return NSFastEnumerationIterator(self)
    }

}

那么,您的for-in循环应该是这样的:

代码语言:javascript
复制
for element in results {
    let symbol = element as! ZBarSymbol
    // ...
}

这个答案也可以通过采用IteratorProtocol来改进,这样您就可以将关联的元素类型指定为ZBarSymbol。我还没想出该怎么做。

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

https://stackoverflow.com/questions/25788290

复制
相关文章

相似问题

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