如何使用objective-c向接口公开自定义初始化实现?

Posted

技术标签:

【中文标题】如何使用objective-c向接口公开自定义初始化实现?【英文标题】:How do I expose custom init implememntation to interface using objective-c? 【发布时间】:2020-02-25 07:46:46 【问题描述】:

我简单地定义了这样的 Swift 协议:

@objc protocol MobileKeyable 
   var assaAbloyLockServiceCode: Int  get 

然后我在我的objective-c类中使用它:

- (id)initWithComposition: (id<MobileKeyable>)composition 
    self = [super init];
    if (self) 
        _lockServiceCodes = @[@([composition assaAbloyLockServiceCode])];
    
    return self;

然后我想像这样在 Swift 中初始化该控制器:

let composition = //here MobileKeyable
MobileKeysController(composition: composition)

所以我需要将该初始化程序暴露给 Objective-c 接口:

#import "MyProject-Swift.h"
@interface MobileKeysController : NSObject <MobileKeysManagerDelegate>
- (instancetype) initWithComposition: (id<MobileKeyable>)composition;
@end

但在这里我有一个错误:MyProject-Swift.h file not found。为什么?

【问题讨论】:

【参考方案1】:

也许 Xcode 试图避免一些循环......只是假设。试试转发声明

@protocol MobileKeyable;

@interface MobileKeysController : NSObject <MobileKeysManagerDelegate>
- (instancetype) initWithComposition: (id<MobileKeyable>)composition;
@end

【讨论】:

以上是关于如何使用objective-c向接口公开自定义初始化实现?的主要内容,如果未能解决你的问题,请参考以下文章

从 Objective-C 向 Swift 公开一个常量变量

Objective-C - 给定一个 UINib 实例,我如何初始化我的自定义 UIView?

iOS 向 WKWebView 公开自定义 API

无法从我的 Objective-C 代码向 Google Analytics/Firebase 发送自定义事件

使用 AWS CloudFront 时,如何向公众隐藏自定义源服务器?

IOS/Objective-C:导航栏自定义Segue效果对比Show Segue