【経緯】
社内もくもく会にてSwiftが始まったので復習がてら。この記事のpart3です。
【基礎構文】
■関数と引数(初期値あり)
func printPrice(price: Int = 0, productString: String = "この商品") {
print("\(productString)は\(price)円です")
}
printPrice(price: 150, productString: "PC")
printPrice(price: 6300)
出力
PCは150円です
この商品は6300円です
■関数と戻り値
/* 戻り値のある関数 */
func valueResult(value: Int = 0) -> Int {
return value / 2
}
/* 戻り値のない関数(省略可能) */
func valueNoneResult(value: Int = 0) -> () {
print("\(value)\nNot return value.")
}
func valueNoneRes(value: Int = 0) {
print("\(value)\nNot res value.")
}
/* 複数のreturnがある場合 */
func numberResult(number: Int) -> Int {
if number > 0 {
return number * 2
}
return number + 10
}
print(valueResult(value: 300))
valueNoneResult(value: 6300)
valueNoneRes(value: 1200)
print(numberResult(number: 5))
print(numberResult(number: -6))
出力
150
6300
Not return value.
1200
Not res value.
10
4
■スコープ
ローカル:関数や制御構文毎のブロックで使用可能
グローバル:関数や制御構文毎のブロックを超えて利用可能
■外部引数名
引数を関数内で別の引数名を用いて値を渡すことが出来る。
また、「_」を使用することで、呼び出し時に引数名を省略することが出来る
func printPrice(num1 price: Int = 0, str1 productString: String = "この商品") {
print("\(productString)は\(price)円です")
}
func add(_ price: Int = 0, _ productString: String = "この商品") {
print("\(productString)は\(price + 100)円です")
}
printPrice(num1: 150, str1: "Windows")
add(150, "Mac")
出力
Windowsは150円です
Macは250円です
■関数のオーバーロード
関数名は変更せずに、引数のデータ型のみ異なる関数を作成したり、引数名や引数の個数が異なる関数を宣言したりすることで実現可能。
上記のように、関数名を変更せずに引数の種類や名前を変更して、同名の関数を呼び出せるようにすることをオーバーロードと言います。
func clAverage(_ a: Int, _ b: Int) -> Int {
return (a + b) / 2
}
func clAverage(_ a: Double , _ b: Double) -> Double {
return (a + b) / 2.0
}
print(clAverage(23, 65))
print(clAverage(23.3, 65.2))
出力
44
44.25
■可変長引数の関数
可変長引数は引数の個数を指定しないような関数のこと。可変長引数で宣言された引数は配列として扱われる。
func average(_ numbers: Int...) -> Int {
var sum:Int = 0
for number in numbers {
sum += number
}
return sum / numbers.count
}
print(average(60, 95, 77, 83, 52))
出力
73
【所感】
関数をメインに。AndroidやiOSと言ったアプリ系の言語だから当然かもしれないですが、スコープの概念にローカルとグローバルがある方が好きです。第三回までやってきて思いますが、個人的にSwiftはかなり良い所取りしてる扱いやすい言語じゃないかなあと思います。