ここでは、1)try/catch
、2)オプションの強制アンラッピングがあります。
更新:try/catch
は問題ありません。try/catch
のコードは実際にはthrow
ではありません。したがって、そこにはtry/catch
は必要ありません。
throw
の例は、FileManager.contentsOfDirectory
です。
func contentsOfDirectory(at url: URL,
includingPropertiesForKeys keys: [URLResourceKey]?,
options mask: FileManager.DirectoryEnumerationOptions = []) throws -> [URL]
あなたは独自の関数throw
にも作ることができますが、あなたの現在のコードはしていません:それは(throws
キーワードに注目してください)Apple's documentationで次のようになります。だからあなたは'catch' block is unreachable...
というメッセージを受け取っています。
2番目の問題はオプションです。
Swiftの「オプション」は、値なしの空ではない可能性があります。
あなたのコードは、これら2つの部分があります。(address_components?[2].short_name)!
と(address_components?[3].short_name)!
!
マークは、あなたがこれらの項目がnilではないだろうと確信していると言っています! (!
はシステムに「はい!それはない」と言ってください)同様に、?
は「うん、これは空ですか?これは価値がありますか?」と考えてください。
このように、これらの値の1つはゼロです。したがって、スウィフトはそれで何ができるのか分からない。クラッシュ・アンド・バーン! ;)
try/catch
に加えて、guard
ステートメントまたはif let
ステートメントが必要です。値がゼロでないことを確認してください。
関連:[私は "Index out of range"をSwiftでキャッチする方法は?](http://stackoverflow.com/questions/37222811/how-do-i-catch-index-out-of-range-in -迅速)。答えは、単にランタイムエラーをキャッチしないことです - 最初に起こることを防ぐ(つまり、[*安全に*オプションをアンラップして](http://stackoverflow.com/q/32170456/2976878)コレクションの境界からインデックスを作成します)。 – Hamish