見出し画像

#4 「関数」Swiftを分かりたい(プログラミング素人の備忘録)

どうも。
久しぶりにプログラミングをやっていこうと思います。ケッシテC#ニアキタワケデハナイデスヨ。

注意

この記事(今シリーズ)は初心者がSwiftをかじりながら、備忘録のような形で投稿していく予定です。
そのため、今シリーズ全体を通して信憑性は非常に低いです。
また専門の方などから見れば、無茶苦茶なこと、おかしなことをしているかもしれませんがご容赦ください。

前回


出てくる用語

関数とは

数学における関数(かんすう、: function: fonction: Funktion: functie: functio、函数とも書かれる)とは、かつてはある変数に依存して決まる値あるいはその対応を表す式のことであった。この言葉はライプニッツによって導入された。その後定義が一般化され、現代では集合に値をとる写像の一種であると理解されるものとなった。

wikipedia:数学

後半よくわかりませんが、数学的には↑らしいです。

プログラミングではもうちょっと違うイメージで、1つの機能を形作るコードをひとまとめにしたものです。値の授受をすることもできます。またこれはプログラミングど素人な自分がなんとなく思ってることですが、「実装の隠蔽」や「モジュール化」的なことにつながると思ってます。

基本的には関数を呼び出すことで、その関数を使用します。

例えばhello worldという文字列を出力する関数を作ってそれを別の場所から呼び出します。

// swift
hello() //hello関数を呼び出し

func hello(){ //hello関数を定義
    print("hello world")
}

また、値を授受することで計算できる関数を使ったりもできます。詳細は後述します。

引数とは

引数とは関数に対して引き渡す値のことです。というか関数が受け取る値です。

戻り値とは

戻り値とは関数が戻す値です。

基本的な使い方

このように関数を呼び出せます。例えば、X関数が1を返す場合はhogeという変数に1が代入されます。

var hoge = X関数名()

関数の定義

swiftではfuncというキーワードを使用して関数を定義します。一応構文と例文を。

引数なし,戻り値なし

これは関数は呼び出されたきり終わりです。別に操作も何もできないです。

//呼び出し
関数名()
//定義
func 関数名(){
    処理
}


Helloworldを表示するだけの関数。

Helloworld()

func Helloworld(){
    print("Helloworld")
}
//結果
//Helloworld
これ以降の画像では省略のためアルファベット+関数にしてます

引数あり,戻り値なし

関数に値を与えられますが、何も戻ってきません。

//呼び出し
関数名(引数名: "引数". 引数2名: "引数2")
//定義
func 関数名(引数名: 引数型, 引数2名: 引数2型){
    処理
}


"hoge"と"fuga"を渡して関数ないで繋いで表示する。

//引数あり,戻り値あり
arg_nonreturn(arg1: "hoge", arg2: "fuga")

func arg_nonreturn(arg1: String, arg2: String){//別の方同士でもいい
    print(arg1 + arg2)
}
//結果
//hogefuga


省略のためアルファベット+関数にしてます

引数あり,戻り値あり

//呼び出し
関数名(引数名: "引数". 引数2名: "引数2") 
//通常は戻り値の入れ先として通常は変数への代入やprint関数への代入を行う
var hoge = 関数名(引数名: "引数". 引数2名: "引数2") //のように
//定義
func 関数名(引数名: 引数型, 引数2名: 引数2型) -> 戻り値型{
    処理
    return 戻り値
}

returnは戻り値を返すキーワードです。ちなみに先のvar hoge に代入するのはreturnで戻された値です。


1と2を渡して足し算して表示する。

//引数あり,戻り値あり
print(arg_return(input: 1, input2: 2))
func arg_return(input: Int, input2: Int) -> Int{ //->はアロー演算子
    return input+input2
}
//結果
//3


引数なし,戻り値あり

引数を書かないで、この関数内で値を用意してそれを返せば引数なし,戻り値ありもかけます。

//呼び出し
関数名()
//通常は戻り値の入れ先として通常は変数への代入やprint関数への代入を行う
var fuga = 関数名() //のように
func 関数名() -> 戻り値型{
    処理
    return 戻り値
}


1+2の結果を返す関数。それをprintで直接表示。

//引数なし,戻り値あり
print(nonarg_return())
func nonarg_return() -> Int{
    return 1 + 2
}
//結果
//3


省略のためアルファベット+関数にしてます

引数あり,複数の戻り値

//呼び出し
var 変数 = 関数名(引数名: 引数, 引数2名: 引数2)
print(変数.引数名)
//定義
func 関数名(引数名: 引数型, 引数2名: 引数2型) -> (戻り値名: 戻り値型, 戻り値2名: 戻り値2型){
    処理
    return (戻り値, 戻り値, 戻り値) //宣言時の順番通り
}

ちなみに戻り値名は省略できますがわかりにくいので名前はつけたほうが管理しやすいかと。

ちなみに呼び出し方

var hoge = 関数名(引数名: 引数, 引数2名: 引数2)
//hogeには二つの値が代入されている
print(hoge.引数名)


fuga関数に1と"ichi"を与えて、fuga関数はそれらの順番を逆にして返す。そのため引数はInt型,String型になっているが、戻り値はString型,Int型となっている。

var one = arg_multreturn(argument: 1, argument2: "ichi")
print(one.Return_value) //関数の引数名
print(one.Return_value2) //関数の引数名

func arg_multreturn(argument: Int, argument2: String) -> (Return_value: String, Return_value2: Int ){
    var return_value = argument2
    var return_value2 = argument
    return (return_value, return_value2)
}
//結果
//ichi
//1
省略のためアルファベット+関数にしてます

まとめ

ざっと構文だけ。

//引数なし,戻り値なし
//呼び出し
関数名()
//定義
func 関数名(){
    処理
}

//引数あり,戻り値なし
//呼び出し
関数名(引数名: "引数". 引数2名: "引数2")
//定義
func 関数名(引数名: 引数型, 引数2名: 引数2型){
    処理
}

//引数あり,戻り値あり
//呼び出し
関数名(引数名: "引数". 引数2名: "引数2") 
//通常は戻り値の入れ先として通常は変数への代入やprint関数への代入を行う
var hoge = 関数名(引数名: "引数". 引数2名: "引数2") //のように
//定義
func 関数名(引数名: 引数型, 引数2名: 引数2型) -> 戻り値型{
    処理
    return 戻り値
}

//引数なし,戻り値あり
//呼び出し
関数名()
//通常は戻り値の入れ先として通常は変数への代入やprint関数への代入を行う
var fuga = 関数名() //のように
func 関数名() -> 戻り値型{
    処理
    return 戻り値
}

//引数あり,複数の戻り値
//呼び出し
var 変数 = 関数名(引数名: 引数, 引数2名: 引数2)
print(変数.引数名)
//定義
func 関数名(引数名: 引数型, 引数2名: 引数2型) -> (戻り値名: 戻り値型, 戻り値2名: 戻り値2型){
    処理
    return (戻り値, 戻り値, 戻り値) //宣言時の順番通り
}

ちなみにprint()もprint関数を呼び出しています。

次回

条件分岐かな~

参考


この記事が気に入ったらサポートをしてみませんか?