在swift文件中调用objective-C属性块,完成块属性变为零

Posted

技术标签:

【中文标题】在swift文件中调用objective-C属性块,完成块属性变为零【英文标题】:Calling objective-C Property block in swift file, the completion block property getting nil 【发布时间】: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];
            
        ;

谁能帮帮我

【问题讨论】:

【参考方案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,它对我有用 :) 我按照你上面的建议做了更改

以上是关于在swift文件中调用objective-C属性块,完成块属性变为零的主要内容,如果未能解决你的问题,请参考以下文章

从 Swift 测试文件中调用 Objective-C 类

无法在 Objective-C .m 文件中调用 Swift 方法

从 Objective-C 到 Swift 的 Swift 传递块

使用完成处理程序(闭​​包)语法从objective-c文件调用swift文件中的函数

当我们在 swift 类中使用 Objective-c 属性时的桥接问题

当我们在 swift 类中使用 Objective-c 属性时的桥接问题