0

感嘆符を使用してオプションをアンラップする必要がある場合を知るのに十分なオプションの使用を理解しています。ガードステートメントに感嘆符が必要ないのはなぜですか?

このコードは機能し、コンパイルされますが、感嘆符は使用されません。

struct Blog{

  var author:String?
  var name: String?

}

func blogInfo2(blog:Blog?){
  guard let blog = blog else {
    print("Blog is nil")
    return
  }
  guard let author = blog.author, name = blog.name else {
    print("Author or name is nil")
    return
  }
  print("BLOG:")
  print(" Author: \(author)")
  print(" name: \(name)")
}

このコードは、感嘆符を付けた場合にも機能します。

struct Blog{

  var author:String?
  var name: String?

}

func blogInfo2(blog:Blog?){
  guard let blog = blog! else {
    print("Blog is nil")
    return
  }
  guard let author = blog.author!, name = blog.name! else {
    print("Author or name is nil")
    return
  }
  print("BLOG:")
  print(" Author: \(author)")
  print(" name: \(name)")
}

これは少し矛盾していませんか、それとも感嘆符が必要ない理由を誰かが明確に説明できますか?

4

3 に答える 3

4

guard let unwrapped = optionalオプションのバインディングです (残念ながら、正しい本のセクションに直接アクセスできるリンクはありません)。オプションの値を安全にアンラップしようとします。値が存在する場合、アンラップは成功し、値が指定された名前に割り当てられます。

guardでの強制的なアンラップの使用よりも、 orでのオプションのバインディングの使用を強く推奨する必要がありますif(違いは「アンラップされた」名前のスコープです) !。強制アンラップの失敗は致命的なエラーです。あなたのプログラムは単にクラッシュします。

于 2016-07-15T19:43:00.947 に答える
1

感嘆符「力」はオプションをアンラップします。guard letまたはif let何も強制せずにアンラップするため、感嘆符は使用されません。

于 2016-07-15T19:42:07.317 に答える