2016-05-25 1 views
1

Noobプログラマ。条件付きバインディングのイニシャライザには、CLPlacemark以外のオプションタイプが必要です

私はインターネットの助けを借りて良いプログラマになろうとしています。だから、Rob PercivalsのiOSクラスを購読しました。私はこのコードで問題を抱えています。私のシステムでは失敗している最新のアップデートでなければならないのですが、それは彼と同じコードです。

CLGeocoder().reverseGeocodeLocation(userLocation) { (placemarks, error) in 

     if (error != nil) { 

      print(error) 

     } else { 

     if let p = CLPlacemark(placemark: placemarks![0] as! CLPlacemark) { 

      print(p) 

      } 
     }    
    } 
} 

可能であれば、赤ちゃんに入れてみてください。ありがとう!

答えて

0

placemarksは、[CLPlacemark]?です。

if let placemarks = placemarks { 
    if let p0 = placemarks.first { 
     print (p0) 
    } 
} 

使用しないでください!:したがって、あなたは、次のようなものを試してみてください。代わりにif letを使用してください。

+0

ありがとうございました!更新されたコードをどのように共有できますか? –

0

エラーメッセージは、ちょうど初期化子CLPlacemark(placemark:)が署名[CLPlacemark]?に応じて返されるので、コードを削減、さらには型キャストを取り除くのでnil値を返すことはありませんんと言います。エラーがnilの場合、配列が存在することが保証されるため、オプションのバインディングは必要ありません。

... 
} else { 
    if !placemarks!.isEmpty { 
     let p = CLPlacemark(placemark: placemarks![0]) 
     print(p) 
    } 
}  
0

私はガード文でさらに一歩それを取って、変数名pでもう少し詳細なものをお勧めしたい... Guardはあなたのコードを乱雑にすることなく、電流の流れを終了するには良い方法です。 if文を使って、特に 'if let'オプションのアンラッピング構文が出て以来です。

CLGeocoder().reverseGeocodeLocation(userLocation) { (placemarks, error) in 

    guard error == nil else { 
     print(error) 
     return 
    } 

    if let placemark = placemarks?.first { 
     let currentPlacemark = CLPlacemark(placemark: placemark) 
     print(currentPlacemark) 
    } 
} 
関連する問題