2016-11-30 84 views
4

我有夫特3上的遊樂場所定義的下面的類:爲什麼錯誤總是NSError?

class MyError: Error { 

} 

然後,創建這樣的類的實例和檢查它是否是一個NSError

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

如預期的輸出,並且我還收到一條警告,表示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。我不明白爲什麼一個Error將始終是NSError,當模型被定義爲另一種方式時(NSError: Error)。任何想法發生了什麼?

+0

我認爲這是相關的:http://stackoverflow.com/questions/39033194/anyobject-not-working-in-xcode8-beta6 – courteouselk

+1

因爲編譯器能夠強制'錯誤'到'NSError'。在Swift倉庫中快速搜索:https://github.com/apple/swift/blob/2fe4254cb712fa101a220f95b6ade8f99f43dc74/stdlib/public/core/ErrorType.swift#L174 –

回答

0

這是故意的行爲,以允許Swift Error類型與Objective-C互操作。

編譯器只會在將Swift錯誤橋接到Objective-C時執行強制操作,或者在您所擁有的只是可能包含任何內容的存在的情況下執行強制操作...請記住它也可以來自throws函數寫在Objective-C中。如果您需要將NSError直接傳遞給某個Objective-C方法作爲參數(無論出於何種原因),這也會讓您得到強制。