Ios 在Objective-C中找不到参数为Swift类的方法

Ios 在Objective-C中找不到参数为Swift类的方法,ios,objective-c,swift,Ios,Objective C,Swift,我对Swift和Objective-C互操作性有一个问题。在我的Objective-C类中,不识别带有Swift类参数的方法。我已将Swift类与桥接头正确集成。此外,Swift类继承自NSObject,变量和方法用@objc声明。我也试过@objcmembers。。。我在网上找不到解决问题的办法。我真的很绝望。我的Swift类使用其他项目中的类,这些项目也用@objc声明。下面是我的问题的一个例子: 项目A:SwiftClassA public class SwiftClassA: NSObj

我对Swift和Objective-C互操作性有一个问题。在我的Objective-C类中,不识别带有Swift类参数的方法。我已将Swift类与桥接头正确集成。此外,Swift类继承自NSObject,变量和方法用@objc声明。我也试过@objcmembers。。。我在网上找不到解决问题的办法。我真的很绝望。我的Swift类使用其他项目中的类,这些项目也用@objc声明。下面是我的问题的一个例子:

项目A:SwiftClassA

public class SwiftClassA: NSObject {

    @objc public init() {
        // do something
    }

    @objc public func aFunction() {
        // do something
    }
}
项目B:SwiftClassB

import ProjectA

public class SwiftClassB: NSObject {

    @objc public init(testA: Double, testB: Double) {
        // do something
    }

    @objc public func bFunction() {
        let classA = SwiftClassA()
        // do something
    }
}
项目C:SwiftClassC

import ProjectA
import ProjectB

public class SwiftClassC: NSObject {
@objc public var classA: SwiftClassA

    @objc public init(classA: SwiftClassA) {
        self.classA = classA
    }

    @objc public func cFunction(testA: Double, testB: Double) {
        let classB = SwiftClassB(testA: testA, testB: testB)
        // do something
    }

    @objc public func  cFunction() {
        // do something
        return
    }
}
项目C:ObjcClass

#import <ProjectA-Swift.h>
#import <ProjectC-Swift.h>

@property (nonatomic, strong) SwiftClassC *swiftClassC;

@implementation ObjcClass

- (ObjcClass *_Nonnull)init {
        SwiftClassA *swiftClassA = [[SwiftClassA alloc] init];
        _swiftClassC = [[SwiftClassC alloc] initWithClassA: swiftClassA];
        return self;
}

- (void)objcFunction { 
        [_swiftClassC cFunctionWithTestA: 1.0 testB: 1.0]; // Property ‚FunctionWithTestA' not found on object of type ’SwiftClassC *’
        [_swiftClassC cFunction];
}

@end
#导入
#进口
@属性(非原子,强)SwiftClassC*SwiftClassC;
@类的实现
-(对象类*_非空)初始化{
SwiftClassA*SwiftClassA=[[SwiftClassA alloc]init];
_swiftClassC=[[swiftClassC alloc]initWithClassA:swiftClassA];
回归自我;
}
-(void)objc函数{
[\u swiftClassC cFunctionWithTestA:1.0 testB:1.0];//在“swiftClassC*”类型的对象上未找到属性“FunctionWithTestA”
[_SwiftClassCC功能];
}
@结束

您还需要将类标记为
@objc
,将它们的方法标记为
@objc
是不够的

@objc public class SwiftClassA: NSObject {

    @objc public init() {
        // do something
    }

    @objc public func aFunction() {
        // do something
    }
}

@objc public class SwiftClassB: NSObject {
    ...
}


@objc public class SwiftClassC: NSObject {
    ...
}

在没有实际查看项目的情况下,很难进行诊断,但是我建议不要将
@objc
放在Swift类中所有内容的前面。相反,将
@objcMembers
放在Swift类声明前面

您的声明如下所示:

@objcMembers
public class SwiftClassA: NSObject {

    public override init() {
        // do something
    }

    public func aFunction() {
        // do something
    }
}

@objcMembers
public class SwiftClassB: NSObject {

    public init(testA: Double, testB: Double) {
        // do something
    }

    public func bFunction() {
        let classA = SwiftClassA()
        // do something
    }
}

@objcMembers
public class SwiftClassC: NSObject {
    public var classA: SwiftClassA

    public init(classA: SwiftClassA) {
        self.classA = classA
    }

    public func cFunction(testA: Double,
                          testB: Double) {
        let classB = SwiftClassB(testA: testA,
                                 testB: testB)
        // do something
    }

    public func cFunction() {
        // do something
        return
    }
}

另一件需要注意的事情是,如果您的项目没有编译,您将无法获得Objective-C读取的swift头文件:

#import <ProjectA-Swift.h>
#import <ProjectC-Swift.h>
#导入
#进口
在我转换的Objective-C代码中,我偶尔会遇到导入声明的问题,它希望
@import“ProjectA Swift.h”
而不是您使用的导入声明,因此您也可以尝试使用它

最后,您可能想打开Objective-C标题,单击左上角的4方形小图标,然后单击“Swift 5 generated interface”(Swift 5生成的界面),当单击时,它将为您提供与协议声明非常相似的内容…不会有方法和变量,但它将向您展示编译器从方法签名的角度所期望的

如果您遇到Objective-C需要方法的特定签名的情况,您可以在方法前面使用不匹配的别名。别名的外观如下所示:

@objcMembers
public class SwiftClassA: NSObject {

    public override init() {
        // do something
    }

    public func aFunction() {
        // do something
    }
}

@objcMembers
public class SwiftClassB: NSObject {

    public init(testA: Double, testB: Double) {
        // do something
    }

    public func bFunction() {
        let classA = SwiftClassA()
        // do something
    }
}

@objcMembers
public class SwiftClassC: NSObject {
    public var classA: SwiftClassA

    public init(classA: SwiftClassA) {
        self.classA = classA
    }

    public func cFunction(testA: Double,
                          testB: Double) {
        let classB = SwiftClassB(testA: testA,
                                 testB: testB)
        // do something
    }

    public func cFunction() {
        // do something
        return
    }
}


@objc(myMethod:parameter1:parameter2)

您不需要将
@objc
放在所有内容前面。你可以把
@objcMembers
放在你的类声明前面,就像这样:
@objcMembers公共类swiftclass:NSObject{//code}
我已经试过了。不幸的是,这并没有解决我的问题。非常感谢你详细的回答。然而,它不能解决我的问题。这些项目编译得很好,不幸的是,我不能使用@导入(ProjutsProjutsExwift)。因为我的项目使用C++模块。我得到了错误信息:在禁用C++模块时使用“@导入”,考虑使用-fMe模块和-FCXX模块。“Swift 5生成接口”也帮不了我。这个问题与SwiftClassC和ObjClass有关。我可以访问不带参数的SwiftClassC函数,但不能访问带参数的函数。Alias也没有帮助…我看不到您的实际代码,但您需要检查以确保将map 1:1转换为Swift的属性和方法。ObjC(ex编号)无法识别某些属性。在这些情况下,您可以定义一个属性w/a setter/getter,以供ObjC调用方使用,它将在代码中更新为Swift only属性。根据您所描述的,这个问题听起来像是桥接头问题,或者您的Swift类中有某种东西阻止它创建-Swift文件