2016-11-30 2 views
4

Iがスイフト3とプレイグラウンド上で定義された次のクラスがあります。私はこのようなクラスのインスタンスを作成し、それが期待どおりに出力されるNSErrorなぜエラーは常にNSErrorですか?

let firstError = MyError() 
firstError is NSError // Output: false 

であるかどうかを確認し、そして

class MyError: Error { 

} 

をまた、Cast from 'MyError' to unrelated type 'NSError' always failsという警告も出ます。これは私のために、総理にかなって、私は、コードを少し変更し、Errorとして変数を宣言した場合、私は奇妙な結果を得る:

var secondError: Error 
secondError = MyError() 
secondError is NSError // Output: true 

を、この場合、私はその最後の行で警告を受けます'is' test is always trueと言っています。私はがいつもNSErrorであることを、モデルが逆の方法で定義されている(NSError: Error)ようにすることはできません。何がここで何が起こっている考えですか?

+0

私はこれが関連していると思う:http://stackoverflow.com/questions/39033194/anyobject-not-working-in-xcode8-beta6 – courteouselk

+1

コンパイラは 'Error'を' NSError'に強制することができるので。 Swiftレポのクイック検索で、これがわかりました:https://github.com/apple/swift/blob/2fe4254cb712fa101a220f95b6ade8f99f43dc74/stdlib/public/core/ErrorType.swift#L174 –

答えて

0

これは、Swift ErrorタイプがObjective-Cと相互運用できるようにする意図的な動作です。

あなたが持っているすべてが...それだけで、同様throwsから来ている可能性が覚えているものを含むことができ、そのError実存でのObjective-Cにスウィフトエラーをブリッジする際に強制を行う、またはあなたの場合のみをコンパイラ関数はObjective-Cで書かれています。これはまた、NSErrorを何らかのObjective-Cメソッドに(何らかの理由で)パラメータとして直接渡す必要がある場合に強制的に呼び出すことができます。

関連する問題