我正在努力构建一个使用自己编写的 C++ 类的 swift 应用程序。
我让它与所需的 Objective-C++ 包装器一起工作,但现在我遇到了问题,我无法使用 int 参数调用外部方法。模糊地它适用于纯数字。
示例如下:
Swift 类的片段:
let validNumber = 5
let refScen = CppToObjCWrapper()
let result = refScen.getCalcLoad(validNumber!)
CppToObjCWrapper.mm中对应的wrapper方法:
-(float)getCalcLoad:(int)value {
RefScenLibCpp refScen;
NSLog(@"Inside Wrapper. Value received: %d", value);
return refScen.getCalcLoad(value);
}
以及RefScenLibCpp.cpp中的C++方法:
float RefScenLibCpp::getCalcLoad(int value) {
return result / 255 * 100;
}
正如我所说,如果我尝试从 swift 类调用此方法,它会抛出错误:
Cannot invoke 'getCalcLoad' with an argument list of '(Int)'
但是如果我只用一个数字从 Swift 类调用方法,例如:
let result = refScen.getCalcLoad(42)
效果很好!我现在花了很多时间在寻找这个问题,但是因为我正在使用 Objective-C++ 和 C++,所以我认为我还没有找到正确的答案。使用(非)选项的不同方法没有帮助。更让我感到困惑的是,我有一个类似的 C++ 方法,它接受一个 String 参数,我调用它就像使用 int 参数的方法一样,但这个方法工作得很好。我希望有人可以帮助我。
最佳答案
为了演示这个问题,我用一个最小的例子在 Swift playground 中重现了这个错误:
func aFuncTakingInt32(val: Int32) {
// do stuff
}
let validNumber = 42
aFuncTakingInt32(validNumber)
此代码产生相同的错误:
Cannot invoke 'aFuncTakingInt32' with an argument list of type '(Int)'
如果我们将 validNumber 的类型显式更改为 Int32:
let validNumber: Int32 = 42
或者如果我们在调用函数时从 Int 构造一个 Int32:
aFuncTakingInt32(Int32(validNumber))
错误消失,代码运行完美。
作为解决此问题的额外有用细节,由于我们尝试使用的方法未在 Swift 中定义,而是在我们导入的 Objective-C++ 文件中定义,因此是一种准确找出函数在 Swift 端期望的参数类型的方法。如果您键入方法名称,并按住 Alt 键并单击方法名称,您将获得一些有用的信息:
现在我们可以看到 Swift 期望传递给该方法的显式类型。在这里,它被清楚地标记为 Int32 变量(我们已经知道,因为我们刚刚在 Swift 中编写了该方法)。当我们无法访问源代码或不确定 Swift 如何将代码从一种语言翻译成 Swift 时,这会非常有用。
Swift 的 Int 类型不同于 Objective-C、C、C++ 和许多其他语言的 int 原语。 Swift 的 Int 更类似于 Objective-C 的 NSInteger。
如果我们尝试将 Objective-C 的 NSInteger 传递给此 C++ 方法,它会编译但可能会生成警告(相对于 Swift 的错误)。这是因为 Objective-C 远没有那么严格,并且愿意对原语进行一些隐式转换。
话虽如此,Swift 有一些类型更等同于 C、C++ 和 Objective-C 的 int(以及其他大小的整数)。在这里,我们很可能需要 Int32。
我们可以使用 let result = refScen.getCalcLoad(42) 的原因是 42 是一个文字,默认情况下将被解释为 Int (正如我们在 let validNumber = 42 中看到的),它也可以被解释为许多其他数字类型,包括 Int32(甚至浮点类型) .
但是,当我们执行以下操作时:
let validNumber = 42
此处,validNumber 必须隐式推断出显式类型。它推断的类型是 Int(不同于 Objective-C、C 和 C++ 的 int)。
所以当我们尝试以下操作时:
let validNumber = 42 let result = refScen.getCalcLoad(validNumber)
我们试图将一个 Int 传递给一个需要 Int32 的方法,因为 Swift 对它允许我们的参数类型非常非常严格通过,它会生成一个错误(Objective-C 可能会生成一个警告)。
我们应该能够通过显式声明 validNumber 的适当类型 Int32 来解决此问题:
let validNumber: Int32 = 42
let result = refScen.getCalcLoad(validNumber)
此外,如果在 Swift 端将此变量的类型保持为 Int32 没有意义,我们可以构造一个 Int32,所以我们可以这样做:Int 中提取
let validNumber = 42
let result = refScen.getCalcLoad(Int32(validNumber))
作为额外的警告,我们不会在使用 String 时遇到这个问题,因为 Objective-C 的 NSString 映射到 Swift 的 String。我们也不会遇到映射到 Swift 的 Character 的 char 或映射到 Swift 的 Bool 的 bool 的问题>.
关于C++ 和 swift : Cannot invoke 'externalMethodName' with an argument list of '(Int)' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30425439/
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request