我正在尝试将object项目转换为for,但我无法找到如何将NSFastEnumeration用于符合NSFastEnumeration的类的对象。
下面是ObjC中的代码:
// get the decode results
id<NSFastEnumeration> results = [info objectForKey: ZBarReaderControllerResults];
ZBarSymbol *symbol = nil;
for(symbol in results)
// just grab the first barcode
break;到目前为止,我试图找到如何做到这一点,但这似乎不起作用,下面是快速代码:
var results: ZBarSymbolSet = infoDictionary?.objectForKey(ZBarReaderControllerResults) as ZBarSymbolSet
var symbol : ZBarSymbol? = nil;
for symbol in results
{ //just grab first barcode
break;
}错误出现在条件- "ZBarSymbolSet“没有一个名为”生成器“的成员。
我做错了什么?
这是屏幕截图

发布于 2014-09-16 15:38:00
在浏览了一下快速框架文件之后,我终于找到了一个名为NSFastGenerator的不错的类。NSSet和朋友们似乎在使用相同的Generator。
对于ZBarSymbolSet,下面是如何扩展它以支持for-in循环:
extension ZBarSymbolSet: SequenceType {
public func generate() -> NSFastGenerator {
return NSFastGenerator(self)
}
}更新:看起来像是SWIFT2.0的协议扩展,为我们解决了这个问题!
发布于 2014-09-11 14:12:37
您定义的类ZBarSymbolSet需要实现Swift SequenceType接口,以便在for <identifier> in <sequence>语法中使用。SequenceType接口是
protocol SequenceType : _Sequence_Type {
typealias Generator : GeneratorType
func generate() -> Generator
}因此,您可以在错误消息中看到对Generator的提及。
也是在语法上:
for <identifier> in <sequence> {
<statements>
}<identifer>只适用于<statements>。因此,symbol在if中的第二次使用将超出范围并产生错误。一个恰当的成语是:
var symbolFound : ZBarSymbol?
for symbol in result {
symbolFound = symbol
break
}
if symbolFound ...当然,但是ZBarSymbolSet实现SequenceType的时间也会用subscript实现CollectionType,因此整个“查找第一个元素”代码将是var symbol = result[0]
发布于 2016-10-14 17:34:45
以下是约翰·埃斯特罗皮亚对Swift 3的回答:
extension ZBarSymbolSet: Sequence {
public typealias Iterator = NSFastEnumerationIterator
public func makeIterator() -> NSFastEnumerationIterator {
return NSFastEnumerationIterator(self)
}
}那么,您的for-in循环应该是这样的:
for element in results {
let symbol = element as! ZBarSymbol
// ...
}这个答案也可以通过采用IteratorProtocol来改进,这样您就可以将关联的元素类型指定为ZBarSymbol。我还没想出该怎么做。
https://stackoverflow.com/questions/25788290
复制相似问题