在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属性块,完成块属性变为零的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Objective-C .m 文件中调用 Swift 方法
从 Objective-C 到 Swift 的 Swift 传递块
使用完成处理程序(闭包)语法从objective-c文件调用swift文件中的函数