-1

In Swift I can give a variable a value using an anonymous closure:

let thumbnailImageView: UIImageView = {
   let imageView = UIImageView()
   imageView.backGroundColor = UIColor.blueColor()
   return imageView;
}

addSubView(thumbnailImageView)
thumbnailImageView.frame = CGRectMake(0,0,100,100)

I am trying to do the same in Obj-C, but this results in an error when adding the subview and setting its frame:

UIImageView* (^thumbnailImageView)(void) = ^(void){
    UIImageView *imageView = [[UIImageView alloc] init];
    imageView.backgroundColor = [UIColor blueColor];
    return imageView;
};

[self addSubview:thumbnailImageView];

thumbnailImageView.frame = CGRectMake(0, 0, 100, 100);
jscs
  • 63,694
  • 13
  • 151
  • 195
ios
  • 165
  • 1
  • 11
  • You need to run (may not be the correct term) the block like: `thumbnailImageView()`. – EDUsta Aug 29 '17 at 14:26
  • using `[self addSubview:thumbnailImageView()];` ??? – Reinier Melian Aug 29 '17 at 14:32
  • Your Swift code doesn't compile. You also don't really need to use a Block for this. You're basically looking for [a statement expression](https://stackoverflow.com/questions/19732070/objective-c-declare-vars-with). – jscs Aug 29 '17 at 14:32
  • that is not block. blocks are written with square brackets – GeneCode Aug 29 '17 at 14:35
  • @GeneCode: _"blocks are written with square brackets"_ What? No, they're not. The ObjC code here correctly creates a Block. – jscs Aug 29 '17 at 14:36
  • 1
    You can use anonymous closures in Obj-C but since there is no type inferring, it won't simplify code, it would actually end up a big mess. – Sulthan Aug 29 '17 at 14:38

1 Answers1

0

You're trying to write in Objective-C with Swift syntax. The Swift example describes a lazily initialized variable, while Objective-C one declares a simple block that returns UIImageView. You'd need to call the block with

[self addSubview:thumbnailImageView()];

However, in this case using the block to initialize a variable makes little sense. If you're looking for lazily initialized properties, it would look like this in Objective-C

@interface YourClass : Superclass

@property (nonatomic, strong) UIImageView* imageView;

@end

@synthesize imageView = _imageView;

- (UIImageView*)imageView
{
    if (!_imageView) {
        // init _imageView here
    }
    return _imageView;
}
mag_zbc
  • 6,801
  • 14
  • 40
  • 62