読者です 読者をやめる 読者になる 読者になる

Swift で早期リターン

早期リターンを使うと、コードが読みやすくなります。

例えば、 nil をとりうる値 hoge があって、 nil のときは処理を終了させたいというメソッドの場合、Ruby ではこんな感じになります。

# 早期リターンなし
def test
  if hoge 
    # hoge が nil でないときの処理
  else
    return
  end
end

# 早期リターンありその 1
def test
  if hoge == nil
    return
  end

  # hoge が nil でないときの処理
end

# 早期リターンその 2
def test
  return if hoge == nil

  # hoge が nil でないときの処理
end

hogenil のときは、 return if hoge == nil 以降の処理が実行されないということがすぐに分かります。

Swift の場合、 こんな感じでかけるかと思います。

// 早期リターンなし
func test() -> Void {
  if hoge != nil {
    // hoge が nil でないときの処理
  } else {
    // hoge が nil のときの処理
  }
}

// 早期リターンあり
func test() -> Void {
  if hoge == nil {
    return
  }

  // hoge が nil でないときの処理
}

Swift2 からは guard というのがあり、これを使うこともできそうです。

func test() -> Void {
  guard hoge != nil {
    return
  }

  // hoge が nil でないときの処理
}

guard を使うことで、早期リターンをしているんだなということがわかりやすくなりそうです。

また、 guard ではアンラップもしてくれるようなので、 hoge の値を使いたいというときにも便利そうです。

// guard なしその 1
func test() -> Void {
  if let unwrappedHoge = hoge {
    print(unwrappedHoge)
  } else {
    return
  }
}

// guard なしその 2
func test() -> Void {
  if hoge == nil {
    return
  }

  print(hoge!)
}
  
// guard あり
func test() -> Void {
  guard let unwrappedHoge = hoge else {
    return
  }

  print(unwrappedHoge)
}