从 Swift 调用 Objective C 自定义初始化函数

Posted

技术标签:

【中文标题】从 Swift 调用 Objective C 自定义初始化函数【英文标题】:Call Objective C custom init function from Swift 【发布时间】:2018-08-13 12:50:33 【问题描述】:

A 类是用 Objective C 编写的,并且有一个自定义的初始化函数

@interface A ()

....

@end

@implementation A

- (id)customInitImplementedInA

    ... 
    return self;

B 类继承自 A 类,并以下列方式使用此自定义初始化:

@interface B : A ()

....

@end

@implementation B
+(instancetype)instanceB
    B *b = [[B alloc] customInitImplementedInA];
    ...
    return b;

现在我想创建一个用 Swift 编写的 C 类,它继承自 A 并使用相同的 init 函数。我怎么做?

class C: A 
  //How do I use customInitImplementedInA here?

【问题讨论】:

在你实际的customInitImplementedInA中,方法名以init开头? @OOPer 是的 那么没问题。 @OOPer 那么答案是什么? 只有一个参数?你为什么不在你的问题中写下实际姓名?使用伪名称使其变得复杂。 【参考方案1】:

您应该可以通过super.methodname 语法来做到这一点。

class C: A 
    init() 
        super.customInitImplementedInA()
        // Any extra initialization for C goes here.
    

【讨论】:

覆盖错误:初始化程序没有覆盖其超类中的指定初始化程序。删除它并收到 customInitImplementedInA 错误:“A”类型的值没有成员“customInitImplementedInA” 我的错误。如果 A 类没有基本 init,则不需要覆盖。 customInitImplementedInA 是通过接口公开还是私有的?如果它是私有的,您将无法访问它。 确实是通过接口暴露出来的。无法想象为什么会出现这个错误 customInit 是否有参数,您是否使用正确的快速语法调用初始化程序?当你做超级。自动完成是否提供与 A 类方法相关的任何内容?【参考方案2】:

如果你从 Obj-C 继承你的 swift 类,那么你的 swift 类将拥有 obj-c init()。 如果你需要调用它,你可以将它包含在你的 swift init 中。

 class C: A 

        var message: B?

        init(message: B) 
            super.customInitImplementedInA()

            self.message = message

        
    

【讨论】:

什么是 var 消息:B? 它只是您自定义初始化的示例。您的 C 类中可以有任何 var。

以上是关于从 Swift 调用 Objective C 自定义初始化函数的主要内容,如果未能解决你的问题,请参考以下文章

无法从Objective C中的swift类调用方法

从 Objective C 调用 Swift 中定义的 NSString 扩展

从 Swift 调用 Objective C 自定义初始化函数

是否可以使用情节提要从 swift 类中调用 Objective c 视图控制器类?

从objective-c++调用swift函数

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