C++;和Swift:不能调用';外部方法名称';参数列表为';(国际)和#x27; 我正在努力构建一个使用自编写C++类的快速应用程序。 我让它与所需的Objective-C++包装器一起工作,但现在我遇到了一个问题,我无法使用int参数调用外部方法。模糊地说,它与一个纯数字有关

C++;和Swift:不能调用';外部方法名称';参数列表为';(国际)和#x27; 我正在努力构建一个使用自编写C++类的快速应用程序。 我让它与所需的Objective-C++包装器一起工作,但现在我遇到了一个问题,我无法使用int参数调用外部方法。模糊地说,它与一个纯数字有关,c++,swift,objective-c++,C++,Swift,Objective C++,示例如下: 来自Swift类的代码片段: let validNumber = 5 let refScen = CppToObjCWrapper() let result = refScen.getCalcLoad(validNumber!) CppToObjCWrapper.mm中对应的包装器方法: -(float)getCalcLoad:(int)value { RefScenLibCpp refScen; NSLog(@"Inside Wrapper. Value received

示例如下:

来自Swift类的代码片段:

let validNumber = 5
let refScen = CppToObjCWrapper()
let result = refScen.getCalcLoad(validNumber!)
CppToObjCWrapper.mm中对应的包装器方法:

-(float)getCalcLoad:(int)value {
  RefScenLibCpp refScen;
  NSLog(@"Inside Wrapper. Value received: %d", value);
  return refScen.getCalcLoad(value);
}
<>和ReFixLiPbCP.CPP:

中的C++方法
float RefScenLibCpp::getCalcLoad(int value) {
  return result / 255 * 100;
}
正如我所说,如果我试图从swift类调用此方法,它会抛出错误:

无法调用参数列表为“(Int)”的“getCalcLoad”

但如果我从Swift类调用该方法,只需使用如下数字:

let result = refScen.getCalcLoad(42)

很好用!我现在正在大量地寻找这个问题,但是当我使用ObjuleC++和C++时,我想我还没有找到正确的答案。使用(非)选项的不同方法没有帮助。更让我困惑的是,我有一个类似的C++方法,它采用字符串参数,我调用的参数和int参数一样,但是这个完全可以。我希望有人能帮我解决这个问题。

为了演示这个问题,我在Swift游乐场用一个简单的例子重新创建了错误:

func aFuncTakingInt32(val: Int32) {
    // do stuff
}

let validNumber = 42

aFuncTakingInt32(validNumber)
此代码生成相同的错误:

无法使用类型为“(Int)”的参数列表调用“afuntakingt32”

如果我们将
validNumber
的类型显式更改为
Int32

let validNumber: Int32 = 42
let validNumber: Int32 = 42
let result = refScen.getCalcLoad(validNumber)
或者,如果我们在调用函数时用
Int
构造一个
Int32

aFuncTakingInt32(Int32(validNumber))
错误消失了,代码运行得非常好


作为解决此问题的另一个有用细节,因为我们尝试使用的方法不是在Swift中定义的,而是在我们要导入的Objective-C++文件中定义的,因此有一种方法可以准确地找出函数在Swift端期望的参数类型。如果键入方法名称,按住Alt键并单击方法名称,您将获得一些有用的信息:

现在我们可以看到Swift希望传递给该方法的显式类型。在这里,它被清楚地标记为
Int32
变量(我们已经知道了,因为我们刚刚用Swift编写了这个方法)。当我们无法访问源代码或不确定Swift如何将代码从一种语言翻译成Swift时,这可能非常有用


< Swift >代码> INT/COM>类型与ObjuleC、C++、C++和许多其他语言不同于<代码> int <代码>原语。Swift的
Int
与Objective-C的
NSInteger
更为相似

如果我们尝试将ObjuleC的代码> NSInteger <代码> C++,编译它,但它可能会产生警告(相对于SWIFT的错误)。这是因为Objective-C没有那么严格,并且愿意对原语进行一些隐式转换

用SWID表示,SWIFT有一些类型,更类似于C、C++和Objul-C的代码> INT/COM>(以及其他大小的整数)。在这里,我们很可能需要

Int32

我们之所以可以使用
let result=refScen.getCalcLoad(42)
,是因为
42
是一个文本,默认情况下会被解释为
Int
(正如我们在
let validNumber=42
中看到的那样),它也可以被解释为许多其他数字类型,包括
Int32
(甚至浮点类型)

但是,当我们执行以下操作时:

在这里,
validNumber
必须隐式推断一个显式类型。它推断的类型是
Int
(这与Objective-C、C和C++的
Int
不同)

因此,当我们尝试以下方法时:

我们试图将
Int
传递给期望
Int32
的方法,因为Swift对它允许我们传递的参数类型非常严格,它会生成错误(Objective-C可能会生成警告)

我们应该能够通过显式地将
validNumber
的类型声明为适当的
Int32
来解决这个问题:

let validNumber: Int32 = 42
let validNumber: Int32 = 42
let result = refScen.getCalcLoad(validNumber)
但是另外,如果在Swift端将此变量的类型保持为
Int32
没有意义,我们可以用
Int
构造一个
Int32
,因此我们可以这样做:

let validNumber = 42
let result = refScen.getCalcLoad(Int32(validNumber))


作为额外的警告,我们不会在
字符串
中遇到这个问题,因为Objective-C的
NSString
映射到Swift的
字符串
。对于映射到Swift的
Character
或映射到Swift的
bool
char
我们也不会遇到这个问题,请务必记下我关于Alt单击的评论。将来它会对你有用的。