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