【问题标题】:Calling objective-C Property block in swift file, the completion block property getting nil在swift文件中调用objective-C属性块,完成块属性变为零
【发布时间】:2019-07-14 09:50:59
【问题描述】:

property block getting nil 我有一个objective-c viewcontroller 类,它有一个属性块 //UAEPassWebViewController.h

@property (nonatomic, copy) void (^onUAEPassSuccessBlock)(NSString *response);
@property (nonatomic, copy) void (^onUAEPassFailureBlock)(NSString *response);

我已经创建了 bridging-header.h 类,并尝试在 swift 类中调用代码,如下所示

webVC.onUAEPassSuccessBlock = { (code: String) in
            print(code)
            if (code != "") {
                self.showHud()
                self.getUaePassTokenForCode(code)
            }
            } as? (String?) -> Void

但是在执行代码时 onUAEPassSuccessBlock 属性变为零 //UAEPassWebViewController.m

if(_onUAEPassSuccessBlock && code) {
            _onUAEPassSuccessBlock(code);
            [self.navigationController popViewControllerAnimated:true];
        }

只有当我从 swift 类调用时才会发生这种情况。如果我从objective-c 类调用相同的属性,下面是它工作正常的代码。 // ViewController.m

 webVC.onUAEPassSuccessBlock = ^(NSString *code) {

            if(code) {

                [self showLoadingIndicator];
                [self getUaePassTokenForCode:code];
            }
        };

谁能帮帮我

【问题讨论】:

    标签: objective-c swift completion-block


    【解决方案1】:

    该值为 nil,因为这是您在添加 as? (String?) -> Void 时要求的。这表示“如果无法将其转换为给定类型,则返回 nil。”无法将此函数转换为正确的类型,因此为 nil。

    你写的函数是(String) -> Void。您不能将其隐式转换为 (String?) -> Void。如果第一个函数收到nil,它会做什么?

    使用 _Nonnull 重写您的 ObjC 以不允许在此位置出现 nil:

    @property (nonatomic, copy) void (^onUAEPassSuccessBlock)(NSString * _Nonnull response);
    

    或者重写函数接受String?

    webVC.onUAEPassSuccessBlock = { (code: String?) in
    ...
    

    【讨论】:

    • 谢谢你 Rob Napier,它对我有用 :) 我按照你上面的建议做了更改
    猜你喜欢
    • 2012-02-25
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 2014-12-12
    • 2011-04-25
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多