2017-03-24 8 views
0
swift3と

と私は1つのエラーを処理したい、address_componentsがnilですが、デバッグに理解トライキャッチ、swift3 Xcodeの

public func titulo() 
     {do{ 
      marca.snippet=address_components?[1].short_name 
      marca.title = try (address_components?[2].short_name)!+" "+(address_components?[3].short_name)! 
      //return titulo 
     }catch{ 
      marca.title="sin titulo" 
      } 

    } 

エラーコール:

enter image description here

私は何ができますかこれを修正するには?

+1

関連:[私は "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

答えて

2

try/catch例外をキャッチせず、スローされたエラーのみをキャッチします。暗黙のうちにラップされていないオプション(!)を使用すると、クラッシュを回避するのに役立つものは何もありません。警告は良いヒントだった。

2

ここでは、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ステートメントが必要です。値がゼロでないことを確認してください。

+1

いいえ、 'do/catch'は' try'の中のコードがスローしないのでうまくありません。 – rmaddy

+0

そして '!'のより良い説明は "nilのクラッシュ"です。スウィフトはあなたがそれが無理ではないが間違っていると確信しているときに何をすべきかを知っている。 – rmaddy

関連する問題