Swift 3 迁移 EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) on cast
Posted
技术标签:
【中文标题】Swift 3 迁移 EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) on cast【英文标题】:Swift 3 migration EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) on casting 【发布时间】:2017-01-06 23:22:16 【问题描述】:谁能告诉我为什么这个选角有异常?
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_BAD_INSTRUCTION (代码=EXC_I386_INVOP,子代码=0x0)
一些上下文:
实际代码属于 ios 应用程序,但您可以在 Playground 中尝试此示例,但会出现错误。
我正在使用 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)
错误信息:
隐式展开的选项只允许在顶层和作为 函数结果
所以它与废除隐式展开的可选参数作为参数有关...... https://github.com/apple/swift-evolution/blob/master/proposals/0054-abolish-iuo.md
【问题讨论】:
【参考方案1】:据我所知,目前在 Swift 中这是不可能的。至于我,如果我们谈论闭包在内部是如何工作的,这根本不合逻辑——它们为每个存储参数的闭包创建类,所以你的代码看起来像这样
class A
var param1: NSNumber!
var param2: Int
class B
var param1: NSNumber?
var param2: Int
然后你试图将 A 类的实例转换为 B 类,这有点奇怪,对吧?
【讨论】:
【参考方案2】:通常,在 Swift 中,您不能使用 as!
将闭包强制转换为另一种类型。
(您应该将错误的建议视为 Swift/Xcode 的错误,并向 Apple 发送错误报告。)
你需要修改闭包的参数类型和声明的返回类型 -- (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]
【讨论】:
以上是关于Swift 3 迁移 EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) on cast的主要内容,如果未能解决你的问题,请参考以下文章