関数の書き方

投稿者: | 2015年6月7日
2016年11月3日追記
Swift2までは関数の呼び出し時に省略可能だった変数名が省略不可になりました。

Swift2以前:function(value)
Swift3以降:function(var_name:value)

軒並みコンパイルでエラーになってビビりましたよ。。。

さて、3ヶ月表示をしてみるでいきなり登場した関数について。来月を表示してみるでNSDate型のデータから年月日情報を得る際に同じようなコードが2回出てきていました。3ヶ月なら3回ぐらい出てきそうな感じです。

同じことを何度も書くのは面倒だしプログラムが長くなって読みにくいので、ひとまとめにして名前をつけてしまいましょうというのが関数です。関数化前後を抜き出してみましょう。

関数使用前

let now: Date = Date()
let cal: NSCalendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian)!
var cal_comp: DateComponents = cal.components([.year, .month, .day, .weekday], from:now)
cal_comp.month!+=1
cal_comp.day! = 1
let next: Date = Calendar.current.date(from:cal_comp)!
cal_comp = cal.components([.year, .month, .day, .weekday], from:next)

関数使用後

// Date型の引数を受け取り、DateComponents型を返す関数
func getCalComp(date: Date) -> DateComponents {
    let cal: NSCalendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian)!
    let components: DateComponents = cal.components([.year, .month, .day, .weekday], from:date)
    return components
}
// 実質プログラムの始まり
let now: Date = Date()
var cal_comp: DateComponents = getCalComp(date:now)
cal_comp.month!+=1
cal_comp.day! = 1
var calen: Date = Calendar.current.date(from:cal_comp)!
cal_comp = getCalComp(date:calen)

行頭に"//"とあるのはコメント行です。関数化後のコードは関数化前の内容に合わせて少しだけ書き直しています。…全然短くなってない。ま、2回ぐらいの繰り返しならね。

関数化する際には頭に"func"をつけて"{}"で囲ったものに、任意の関数名をつけます。今回のように、処理の内容は同じだけれども与えるデータや処理の結果が異なるものは、各々"引数"や"戻り値"を設定します。

関数に与えるデータである引数は関数名の後ろに"()"でくくって指定します。複数指定する場合は","で区切ります。各々の引数の型は":"に続けて指定します。

処理の結果である戻り値は引数の()の後に"->"をつけて型を指定します。戻り値は関数内で関数の終了命令である"return"に続けて指定します。