【问题标题】:Swift 3 migration EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) on castingSwift 3 迁移 EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) on cast
【发布时间】: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

【问题讨论】:

    标签: ios swift3 xcode8


    【解决方案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]
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-13
        • 1970-01-01
        相关资源
        最近更新 更多