我的目标c文件中有一个函数(比如说MyBlockExecutor类):
+ (void) runBlockFromDictionary: (NSDictionary*) blocksDict andKey: (NSString*) key
{
if ( [blocksDict objectForKey: key] != nil )
{
((MyBlock)[blocksDict objectForKey: key])();
}
}
现在,我想从Swift调用此函数。这是我的快速电话:
MyBlockExecutor.runBlock(from: [
"key1":{ ()->Void in
print("block for key1 called")
}
], andKey: "key1")
这会使我的应用程序崩溃。我在这条线上收到EXC_BAD_ACCESS错误:
((MyBlock)[blocksDict objectForKey: key])();
虽然,从Objective-C调用相同的功能非常好。另外,我将MyBlock定义为:
typedef void (^MyBlock)(); //defined in MyBlockExecutor.h file
我该如何解决?
编辑:我对目标c函数的更改持开放态度,我只是需要以某种方式将闭包的集合从swift传递到我的目标c函数并运行该块。
您可以使用与Swift块不起作用类似的方法:@convention(block)
使用Objective-
C块调用约定对块进行注释,并(明确地)将其AnyObject
强制转换为字典之前:
let myBlock: @convention(block) () -> Void = {
print("block for key1 called")
}
let dict = ["key1": myBlock as AnyObject]
MyBlockExecutor.runBlock(from: dict, andKey: "key1")
这按我的测试预期工作。
它也类似于奎因的《爱斯基摩人》。在Apple开发人员论坛中建议
将其作为通过指针传递闭包(在Swift中定义)作为与Objective-C兼容的对象的方法,只有我用unsafeBitCast
更简单的代替了as AnyObject
。
您还可以内联编写所有内容:
MyBlockExecutor.runBlock(from: ["key1": {
print("block for key1 called")
} as @convention(block) () -> Void as AnyObject
], andKey: "key1")
或定义一个辅助函数:
func objcBlock(from block: @convention(block) () -> Void) -> AnyObject {
return block as AnyObject
}
MyBlockExecutor.runBlock(from: ["key1": objcBlock {
print("block for key1 called")
}], andKey: "key1")
本文向大家介绍Swift如何调用Objective-C的可变参数函数详解,包括了Swift如何调用Objective-C的可变参数函数详解的使用技巧和注意事项,需要的朋友参考一下 前言 这个问题是一个朋友问我怎么写,一开始我是拒绝的。我想这种东西网上随便 google 下不就有了吗。他说,查了,但没大看明白。于是我就查了下,没想到这个写法确实有点诡异,我第一反应也没看明白。所以随便水一篇文章,强行
问题内容: 我有一个旧的Objective-C项目,我想调用新的Swift函数和对象,我已经创建了文件“ ”和“ ” 对我来说,从Swift调用函数到Objective-C很容易,但是我有一个反向问题。 因此,我创建了一个简单的类“ System.Swift” 现在我尝试按照此处和文件内的文档进行操作 并且已将其导入到Objective-C类中。此时,在我的Objective-C代码的Object
问题内容: 我一直在想是否可以在PHP中将函数作为参数传递;我想要类似的东西,当您在JS中编程时: 我想要的是在exampleMethod中的某处执行该功能。这在PHP中可行吗? 问题答案: 如果您使用的是PHP 5.3.0或更高版本,则是可能的。 请参见手册中的匿名函数。 对于您的情况,您将这样定义:
Swift 3 与 Objective-C 的 API 接口比以前的版本更好用了。比如说,Swift 2 把 Objective-C 中的 id 映射为 Swift 中的 AnyObject ,它一般能储存类类型的值。Swift 2 同样为一些桥接的值类型提供了隐式的 AnyObject ,比如说 String 、 Array 、 Dictionary 、 Set 以及某些数值,作为一种 Swi
问题内容: 我想知道,如果有人能告诉我,范围函数如何采用:单个参数,或或。它是否使用一个参数来收集参数,然后使用一系列if语句根据所提供的参数数量来分配正确的值?从本质上说,它规定,如果有一个参数,然后将其设置成停止争论,或者如果有两个那么他们,和,或者如果有三个然后设置这些作为,和分别?我想知道如果要用纯Cpython编写范围怎么办。谢谢!!! 更新 :当我最初问这个问题时,我并没有澄清我想知道
问题内容: 我的密码 第一个文件: 第二档: 在上面的代码中,仅将“数据”字典的键传递给,但我希望键值对传递。如何纠正呢? 我希望这样被修改 这是我的要求,根据此给出答案 编辑: 字典键 类 更改为 标准 问题答案: 如果要像这样使用它们,请正常定义变量名称的函数: 现在,您可以在 调用 函数时使用: 它会按您想要的方式工作。 PS 请勿使用。等保留字(例如,改用)