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的主要内容,如果未能解决你的问题,请参考以下文章

从 swift 2.3 问题迁移到 swift 3.1

Swift 2.3 到 Swift 3.1 迁移 - Alamofire 请求错误

swift 3 迁移后 NSPredicate 崩溃

“无下标成员”错误(迁移到 Swift 3)

Swift 3 迁移工作总结

NSData init?(contentsOf url: URL) 从 Swift 2 迁移到 Swift 3