ios - 从 Swift 调用存储在 NSDictionary 中的 Objective-C block

标签 ios objective-c swift

预期结果:我创建了一个 block ,将其存储在 NSDictionary 中,将字典传递给 Swift 类,从字典中检索 block ,然后调用 block 。

实际结果:从字典中检索 block 会导致 EXC_BAD_INSTRUCTION。

示例代码 Obj-C View Controller :

- (void)viewDidLoad {
    [super viewDidLoad];

    void (^completionHandler)() = ^() {
        [self printBlahBlah];
    };

    NSDictionary *dict = @{@"blah":completionHandler};
    Nav *nav = [Nav new];
    [nav done:dict];
}

-(void)printBlahBlah { NSLog(@"BlahBlah"); }

Nav Swift 类的示例代码:

@objc public class Nav : NSObject {

    @objc public func done(dict: NSDictionary){
        let block = dict["blah"] as! ()->Void //EXC_BAD_INSTRUCTION
        block()
    }
}

最佳答案

所以这是可行的:

@objc public class Nav : NSObject {

    typealias MyFunBlock = @convention(block) () -> Void;

    @objc public func done(dict: NSDictionary){
        let block = unsafeBitCast(dict["blah"], BoolBlock.self) as BoolBlock?
        block?()
    }
}

但是 unsafeBitCast 的文档说:

/// Returns the bits of `x`, interpreted as having type `U`.
///
/// - Warning: Breaks the guarantees of Swift's type system; use
///   with extreme care.  There's almost always a better way to do
///   anything.
///
@warn_unused_result
public func unsafeBitCast<T, U>(x: T, _: U.Type) -> U

我觉得我不想用这个。

功劳真的归功于这个人:https://stackoverflow.com/a/28376909/1366911

关于ios - 从 Swift 调用存储在 NSDictionary 中的 Objective-C block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40591550/

相关文章:

ios - 后台警报(ios 7)

ios - iPad 应用程序在安装到设备时卡住

iphone - 如何从导航堆栈中删除所有 View ?

objective-c - 在启用沙箱的情况下在 OSX 10.10 上制作 App 默认处理程序

swift 如何将日期组件转换成双倍以获得上传速度

ios - 无法在 UIStackView 中设置编程布局约束

ios - 延迟实例化

ios - 如何清除 Objective-C 中的应用程序缓存?

Swift Parse 将 MapView 中的注释保存为 PFGeoPoint

ios - 当设备大小快速变化时如何获取 subview 的当前大小?