2017-01-06 11 views
2

このキャストに例外がある理由は誰にも分かりますか?キャスト時のSwift 3の移行EXC_BAD_INSTRUCTION(コード= EXC_I386_INVOP、サブコード= 0x0)

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は、次のメッセージが表示されます。

error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

いくつかのコンテキスト:

実際のコードは、iOSアプリケーションに属していますが、運動場でこのサンプルを試すことができますし、エラーが発生します。

私はいくつかのコードをXcode 8.2.1移行ツールを使用してSwift 3に移行しています。キャストはXcodeによって提案されていますが、成功してビルドされますが、単体テストからコードを実行すると失敗します。

ありがとうございました。少しのクリーンアップ

UPDATE

、これが見つかりました:

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) 

エラーメッセージ:

Implicitly unwrapped optionals are only allowed at top level and as function results

だからそれがパラメータとして暗黙的に開封されたoptionalsの廃止に関係しています... https://github.com/apple/swift-evolution/blob/master/proposals/0054-abolish-iuo.md

答えて

0

通常、Swiftでは、as!で別のタイプにクロージャをキャストできません。 (あなたはスウィフト/ 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] 
    } 
1

私が知っているように、今はスウィフトでは不可能です。私たちは、クロージャが内部でどのように機能するかについて話す場合、私のためとして、それは、まったく論理的ではない - 彼らは、パラメータを格納し、各閉鎖のためのクラスを作成するので、あなたのコードは、その

class A { 
    var param1: NSNumber! 
    var param2: Int 
} 

class B { 
    var param1: NSNumber? 
    var param2: Int 
} 

そして、あなたがキャストしようとしているように見えますクラスAからクラスBのインスタンス、少し奇妙な、右か?