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]
    }