Xcode 7 GM - not able to call enumerateObjectsUsin

2019-08-15 05:01发布

问题:

I just downloaded xcode 7 GM and trying to call the method enumerateObjectsUsingBlock of NSArray with iOS 9 but it shows the following error at build time.

Incompatible block pointer types sending 'void (^)(SKSpriteNode *__strong, NSUInteger, BOOL *)' to parameter of type 'void (^ _Nonnull)(SKNode * _Nonnull __strong, NSUInteger, BOOL * _Nonnull)'

This is the Apple documentation about enumerateObjectsUsingBlock method:

- (void)enumerateObjectsUsingBlock:(void (^)(ObjectType obj,
                                             NSUInteger idx,
                                             BOOL *stop))block

and this is my code:

[self.children enumerateObjectsUsingBlock:^(SKSpriteNode * child, NSUInteger idx, BOOL *stop) {
    child.position = CGPointMake(child.position.x-self.scrollingSpeed, child.position.y);
    if (child.position.x <= -child.size.width){
        float delta = child.position.x+child.size.width;
        child.position = CGPointMake(child.size.width*(self.children.count-1)+delta, child.position.y);
    }
}];

where self.children is a NSArray.

I don't understand, what am I doing wrong?

回答1:

Did you read the error message? Did you notice the "nonnull" in two places? In Xcode 7, there are stricter rules. You have an array which is guaranteed to contain SKNode, not SKSpriteNode. There are pointers required to be nonnull pointers. You'll need to change your code to handle this.