2016-07-04 41 views
2

我在斯威夫特3個工作,和我遇到麻煩以下,如果讓測試:斯威夫特3:「如果讓」可選綁定錯誤

let plistUrl = Bundle.main().urlForResource("Books", withExtension: "plist") 

if let plistData = try Data(contentsOf: plistUrl!) { 
    ...some code 
} 

編譯器顯示的,如果讓語句下面的錯誤:

Initializer for conditional binding must have Optional type, not 'Data' 

這裏有什麼問題,我該如何解決?

回答

4

try不返回可選項。 try?呢。

+0

這奏效了!我知道它必須是一些愚蠢簡單的東西。 –

0

使用Swift,處理錯誤和從可能引發錯誤的方法中檢索數據的正確方法在「Swift編程語言」的Error Handling部分進行了說明。

因此,根據您的需要,您可以選擇以下三種模式之一來解決您的問題。


1.檢索數據,並使用do-catchtry關鍵字

您使用do-catch聲明運行的代碼塊來處理錯誤處理錯誤。如果do子句中的代碼引發錯誤,則會將其與catch子句進行匹配,以確定哪個子句可以處理該錯誤。

用法:

let plistUrl = Bundle.main().urlForResource("Books", withExtension: "plist")! 

let plistData: Data? 
do { 
    plistData = try Data(contentsOf: plistUrl) 
} catch { 
    print(error as NSError) 
    plistData = nil 
} 

print(plistData) 

2.檢索數據,並使用try?關鍵字

您使用try?處理錯誤的將其轉換爲一個可選的轉換錯誤,可選值值。如果在評估try?表達式時發生錯誤,則表達式的值爲零。

用法:

let plistUrl = Bundle.main().urlForResource("Books", withExtension: "plist")! 

guard let plistData = try? Data(contentsOf: plistUrl) else { 
    return 
} 

print(plistData) 

3.使用try!關鍵字

有時候你知道投擲函數或方法將不檢索數據,並禁用錯誤傳播,事實上,在運行時拋出一個錯誤。在這種情況下,您可以在表達式之前編寫try!以禁用錯誤傳播並將該調用包裝在運行時斷言中,以避免引發錯誤。如果實際發生錯誤,您將收到運行時錯誤。

用法:

let plistUrl = Bundle.main().urlForResource("Books", withExtension: "plist")! 

let plistData = try! Data(contentsOf: plistUrl) 

print(plistData)