変数と定数の基本

関数の基本形
クロージャー

関数の基本形

一目でわかるswiftの関数のかたち。

func greet(name: String, day: String) -> String {
	return "Hello \(name), today is \(day)."
}
greet("Bob","Tuesday")

「func 関数名(引数:型, ...) -> 返り値の型 {}」といった感じ。返り値は1つだけではなく複数返すことが出来る(tupleを返す)。

func getGasPrices() -> (Double, Double, Double) {
	return (3.59, 3.69, 3.79)
}
getGasPrices()

引数の個数が不定とであるような関数もつくれる。

func sumOf(numbers: Int...) -> Int {
	var sum = 0
	for number in numbers {
		sum += number
	}
	return sum
}
sumOf()
sumOf(42, 597, 12)

クロージャー

関数の中に関数を作るなんてこともできる。
次の例では、returnFifteen()の中にadd()が作られている。でもって、内側の関数は外側の関数で宣言された変数にアクセスすることが可能なので、長ったらしく複雑な関数を簡潔に書くのに便利、かも。

func returnFifteen() -> Int {
	var y = 10
	func add() {
		y += 5	//外側のの変数yにアクセス
	}
	add()
	return y
}
returnFifteen()

返り値に関数を取ることも可能。この場合は「func 関数名() -> (返す関数の引数の型 -> 返す関数の返り値の型) {}」と書く。ややこしい。
作ったら変数の中に収めて、変数(引数)とやってやる。

func makeIncrementer() -> (Int -> Int) {
	func addOne(number: Int) -> Int {
		return 1 + number;
	}
	return addOne
}
var increment = makeIncrementer()
increment(7)

引数に関数を取ることもできる。この時、引数の部分には「仮引数名: 渡す関数の引数型 -> 渡す関数の返り値型」とする。

func hasAnyMatches(list: Int[], condition: Int -> Bool) -> Bool {
	for item in list {
		if condition(item) {
			return true
		}
	}
	return false
}
func lessThanTen(number: Int) -> Bool {
	return number < 10
}

var numbers = [20, 19, 7, 12]
hasAnyMatches(numbers, lessThanTen)

hasAnyMatchesは「配列の要素を見て、指定の条件を満たすものが1つでもあればtrue、1つも見つからなかったらfalseを返す」みたいなだいたいそんな感じのヤツである。んで、ここでは指定条件が「10未満の数」となっていて、それをチェックする関数lessThanTenを引数でhasAnyMatchesで渡しているわけである。

で、配列の個々の要素をいじりたいんだったらmapがあり、括弧内に関数直書きが可能。

numbers.map({
	(number: Int) -> Int in
	let result = 3 * number
	return result
})
/*
配列.map({
	(引数: 型) -> 返り値型 in
	……
	return なんとか
})
*/

これは型が明らかで命令も1個しかないので次のような書き方も可能。

numbers.map({ number in 3 * number })

最後に、超省略形クロージャー。ソートの関数。

sort([1, 5, 3, 12, 2]) { $0 > $1 }

↑ PAGE TOP