Sharon Nathaniel Sharon Nathaniel - 1 month ago 11
iOS Question

NSFastEnumeration in Swift

I am trying to convert an Objective-C project to swift, but I am unable to find how to use NSFastEnumeration for an object of a class that conforms to NSFastEnumeration.

Here is the code in ObjC:

// get the decode results
id<NSFastEnumeration> results = [info objectForKey: ZBarReaderControllerResults];

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


so far I tried to find how to do this, but this doe not seems work, here is the swift code:

var results: ZBarSymbolSet = infoDictionary?.objectForKey(ZBarReaderControllerResults) as ZBarSymbolSet

var symbol : ZBarSymbol? = nil;

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


the error comes in for condition - "ZBarSymbolSet" does not have a member named "Generator"

What am I doing wrong?

Here is the screen shot
enter image description here

Answer

After a while poking around the swift framework files, I finally found this nice class called NSFastGenerator. NSSet and friends seem to be using the same Generator.

For ZBarSymbolSet, here's how you'd extend it to support for-in loops:

extension ZBarSymbolSet: SequenceType {
    public func generate() -> NSFastGenerator {
        return NSFastGenerator(self)
    }
}

Update: Looks like Swift 2.0's protocol extensions fixed this for us!

Comments