Swift
CommandLineTool

Swift コマンドラインから文字列を取得する

More than 1 year has passed since last update.

環境

  • Xcode9.0
  • macOS High Sierra 10.13
  • CommandLineTool

スペース区切りで型が異なる入力がされた場合

nilを除く配列取得

func readLineArrayWithoutNil<T: LosslessStringConvertible>() -> [T] {
    return readLine()!.split(separator: " ").flatMap{ T.init(String($0)) }
}

nilを含む配列取得 (入力数が知りたい場合など)

func readLineArrayIncludeNil<T: LosslessStringConvertible>() -> [T?] {
    return readLine()!.split(separator: " ").map{ T.init(String($0)) }
}

実行結果

入力 "1 a 1.125"

let ints: [Int] = readLineArrayWithoutNil() 
// [1]

let ints: [Double] = readLineArrayWithoutNil() 
// [1.0, 1.125]

let ints: [String] = readLineArrayWithoutNil() 
// ["1", "a", "1.125"]
let ints: [Int] = readLineArrayIncludeNil() 
// [Optional(1), nil, nil]

let ints: [Double] = readLineArrayIncludeNil() 
// [Optional(1.0), nil, Optional(1.125)]

let ints: [String] = readLineArrayIncludeNil() 
// [Optional("1"), Optional("a"), Optional("1.125")]

コマンドラインの入力を1文字ずつStringで取得するには

readLine()!.flatMap{ String($0) }

実行結果

入力 "1 a 1.125"

readLine()!.flatMap{ String($0) } 
//["1", " ", "a", " ", "1", ".", "1", "2", "5"]

おまけ

readLineArrayの関数を作っていて、編集後コンパイルすると初回だけ出力がおかしい時がありました。Xcodeのバグだろうか。
再度コンパイルするとうまくいきます(謎