2016-07-04 1 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セクションで説明しています。

したがって、必要に応じて、次の3つのパターンのいずれかを選択して問題を解決できます。


1.あなたは、コードのブロックを実行して、エラーを処理するためにdo-catchステートメントを使用し、データを取得し、do-catchtryキーワード

を使用してエラーを処理します。 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?式の評価中にエラーがスローされた場合、式の値はnilになります。

使用法:

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) 
関連する問題