Skip to content

Instantly share code, notes, and snippets.

@d-date
Last active February 9, 2017 00:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save d-date/3c1eec3dc4ffbcb133296ea603be772e to your computer and use it in GitHub Desktop.
Save d-date/3c1eec3dc4ffbcb133296ea603be772e to your computer and use it in GitHub Desktop.
StringをIntに変換

お題

StringをIntに変換するとき、どう書いたらスマートなんでしょうね。 例えば、ある本の最初のサンプルアプリで、初心者向けに説明するときはこんな感じ。 電卓のような、ボタンに1~9の文字がセットされていて、それをIntに変換するときの処理。

func stringToInt(_ string: String) -> Int {
  var value: Int = 0
  switch string {
    case "1": value = 1
    case "2": value = 2
    case "3": value = 3
    case "4": value = 4
    case "5": value = 5
    case "6": value = 6
    case "7": value = 7
    case "8": value = 8
    case "9": value = 9
    default: value = 0  
  }
...

プロダクションコードにこんなの入ってきたら、即PR却下するんだけど、じゃあどう書くのがスマートなんでしょうね。

別解1: if letを使う

init?(_ string: String)がOptional<Int>を返すことを利用する。

var value = 0
if let v: Int = Int(title) {
  value = v
}

別解2: nil coalescing operatorを使う

nil coalescing operator

let hoge = A ?? B

AがnilじゃないときはAが代入され、Aがnilのときは、Bが代入される

let value: Int = Int(title) ?? 0

別解3: Closureを使う

let value: Int = {
  if let v: Int = Int(title) {
    return v
  }
  return 0
}()

別解3を見せた時に、このクロージャよく理解できないという話をしていたので、このように見せてみた。

let value: Int = { *() -> Int in
  if let v: Int = Int(title) {
    return v
  }
  return 0
}()

いわゆる無名関数なので、普通の関数にして見比べてみればよい。

func hoge() -> Int {
    if let v: Int = Int(title) {
      return v
    }
  return 0
}

let value: Int = hoge()
@bannzai
Copy link

bannzai commented Feb 8, 2017

let についての重要性も抑えるならこれも書いておくといいかもです。

let value: Int // <= 後続の処理で絶対決まる場合であれば`var`である必要がない
if let title = Optional("10"),
    let v = Int(title) {
    value = v
} else {
    value = 0
}
print(value) // 10

@bannzai
Copy link

bannzai commented Feb 8, 2017

Optionalを理解した時に面白い書き方もついでに

let value: Int
switch Int("10") {
case .none:
    value = 0
case .some(let v):
    value = v
}
print(value) // 10

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment