Ios 转换时的Swift 3迁移EXC_BAD_指令(代码=EXC_I386_INVOP,子代码=0x0)
有人能告诉我为什么这个角色会有例外吗Ios 转换时的Swift 3迁移EXC_BAD_指令(代码=EXC_I386_INVOP,子代码=0x0),ios,swift3,xcode8,Ios,Swift3,Xcode8,有人能告诉我为什么这个角色会有例外吗 func aSpecialMethod(colorRange: @escaping (NSNumber?,Int) -> [Any]!) { print("do something here") } let colorRange = { (param1: NSNumber!, param2: Int) -> [Any]! in return [UIColor.red] } as! (NSNumber?, Int) -> [
func aSpecialMethod(colorRange: @escaping (NSNumber?,Int) -> [Any]!) {
print("do something here")
}
let colorRange = { (param1: NSNumber!, param2: Int) -> [Any]! in
return [UIColor.red]
} as! (NSNumber?, Int) -> [Any]!
aSpecialMethod(colorRange: colorRange)
Xcode显示以下消息:
错误:执行被中断,原因:EXC\u错误\u指令
(代码=EXC_I386_INVOP,子代码=0x0)
一些背景:
实际代码属于iOS应用程序,但您可以在操场上尝试此示例,并且会发生错误
我正在使用Xcode 8.2.1迁移工具将一些代码迁移到Swift 3。转换是由Xcode建议的,它构建成功,但是当从单元测试运行代码时,它将失败
谢谢你的帮助
更新
清理了一点后发现:
func aSpecialMethod(colorRange: @escaping (NSNumber?,Int) -> [Any]!) {
print("do something here")
}
let colorRange = { (param1: NSNumber!, param2: Int) -> [Any]! in
return [UIColor.red]
} as (NSNumber!, Int) -> [Any]!
aSpecialMethod(colorRange: colorRange)
错误消息:
隐式展开的选项仅允许在顶层和
功能结果
因此,它与取消隐式展开的选项作为参数有关。。。
据我所知,目前在Swift中不可能做到这一点。对我来说,这根本不符合逻辑,如果我们讨论闭包是如何在内部工作的——它们为每个闭包创建类来存储参数,所以您的代码看起来是这样的
class A {
var param1: NSNumber!
var param2: Int
}
class B {
var param1: NSNumber?
var param2: Int
}
然后,您试图将类A的实例强制转换为类B,这有点奇怪,对吗?通常,在Swift中,您不能使用
as将闭包转换为另一种类型代码>。
(您应该将错误建议视为Swift/Xcode的错误,并向苹果发送错误报告。)
您需要修改闭包的参数类型和声明的返回类型--(NSNumber?,Int)->[Any]代码>:
let colorRange = { (param1: NSNumber?, param2: Int) -> [Any]! in
return [UIColor.red]
}
aSpecialMethod(colorRange: colorRange)
或者将闭包放在Swift可以推断类型并省略类型注释的位置:
aSpecialMethod { param1, param2 in
return [UIColor.red]
}