Skip to content

Instantly share code, notes, and snippets.

@dmcrodrigues
Last active August 12, 2016 11:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dmcrodrigues/f937171f22c58303c3aa1e295066dac9 to your computer and use it in GitHub Desktop.
Save dmcrodrigues/f937171f22c58303c3aa1e295066dac9 to your computer and use it in GitHub Desktop.
Assigning an Objective-C block without bridging through a Swift closure crashes on invocation
#import <Foundation/Foundation.h>
typedef void (^SomeBlock)(NSString * _Nonnull someParameter);
_Nonnull SomeBlock defaultBlock();
@interface SomeObject : NSObject
@property (nonatomic, copy, nullable) SomeBlock someBlock;
- (void)someAction;
@end
#import "SomethingObjectiveC.h"
SomeBlock defaultBlock() {
return ^(NSString *someParameter) {
NSLog(@"%@", someParameter);
};
}
@implementation SomeObject
- (void)someAction {
if (self.someBlock) {
self.someBlock(@"Hello World!");
}
}
@end
let something = SomeObject()
// Works as expected
something.someBlock = { print($0) }
something.someAction()
// Crashes 💥
something.someBlock = defaultBlock()
something.someAction()
// Works as expected
something.someBlock = Optional(defaultBlock())
something.someAction()
// Works as expected
something.someBlock = unsafeBitCast(defaultBlock(), to: SomeBlock.self)
something.someAction()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment