English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
この記事では、異なるタイプの入力を取得し、出力を返すユーザー定義関数について学びます。
前回の記事Swift関数内、関数について学びました。今度は、Swiftで関数を作成するさまざまな方法とタイプ、すなわち関数内で入力と出力を処理する方法について探求します。
これらのタイプの関数は何も入力や返り値を受け取らない。
func funcname() { //文 } または func funcname() -> () { //文 } または func funcname() -> Void { //文 }
これらの语法は、引数を持ち、返り値を持たない関数を作成するためにはすべて有効です。
上記の语法 func funcname()->()も func funcname() と同義です。->void、voidは()の型別名に過ぎません。以下を参照してアクセスできますSwiftの型別名詳細については、こちらを参照してください。
func greetUser() { print("Good Morning!") } greetUser()
上記のプログラムを実行すると、以下のようになります:
Good Morning!
これらのタイプの関数は何も入力パラメータを受け取りませんが、値を返します。返り値のタイプを追加するには、矢印(-)と返り値のタイプ。
func funcname() -> ReturnType { //文 return value }
func greetUser() -> String { return "Good Morning!" } let msg = greetUser() print(msg)
上記のプログラムを実行すると、以下のようになります:
Good Morning!
上記のプログラムでは、返り値のタイプとして String を定義しました。したがって、このステートメントは関数内部のステートメントから文字列を返さなければなりません。そうしないとエラーが発生します。
return キーワードは、プログラムのコントロールを関数本体から関数呼び出しに移行します。関数から値を返す必要がある場合は、return キーワードの後に返す値を追加してください。
return "Good Morning!" ステートメントは、String タイプの値を関数から返します。注意していただきたいのは、返り値のタイプと値が一致している必要があります。
また、返り値を変数や定数に割り当てることもできます。let msg = とすると、返り値を定数 msg に割り当てます。したがって、このステートメント print(msg) は出力します"Good Morning!"。
その値を無視したい場合は、下線 _ を使用してください。つまり let _ = です。
引数は関数内で入力用に使用されます。引数には引数名とタイプが含まれ、その後コロン(:)が続きます。これらのタイプの関数は入力引数を使用し、値を返しません。
func funcname(parameterName: Type) { //文 }
func greetUser(msg: String) { print(msg) } greetUser(msg: "Good Morning!")
上記のプログラムを実行すると、以下のようになります:
Good Morning!
上記のプログラムでは、この関数は文字列タイプの単一の引数を受け取り、この引数は関数内でのみ使用できます。msgは引数の名前です。
関数greetUser(msg: "Good Morning!")に文字列値の引数msgを渡して呼び出すことができます。この引数名はgreetUser()関数内でのみ見えます。
したがって、print(msg)文は "Good Morning!"。
これらのタイプの関数は引数を使用し、値を返します。
func funcname(parameterName: Type) -> ReturnType { //文 }
func greetUser(name: String) -> String { return "Good Morning! " + name } let msg = greetUser(name: "Jack") print(msg)
上記のプログラムを実行すると、以下のようになります:
Good Morning! Jack
上記のプログラムでは、この関数はStringタイプの単一の引数を受け取り、Stringタイプの値「Good Morning! Jack」を返します。
これらのタイプの関数は、カンマで区切られた複数の引数を使用し、複数の値を返します。Swiftではタプルを使用して複数の値を返すことができます。
func funcname(parameterName: Type, parameterName2: Type ...,) -> (ReturnType, ReturnType...) { //文 }
func greetUser(name: String, age: Int) -> (String, Int) { let msg = "Good Morning!" + name var userage = age if age < 0 { userage = 0 } return (msg, userage) } let msg = greetUser(name: "Jack", age: -2) print(msg.0) print("You (msg.1) coins left")
上記のプログラムを実行すると、以下のようになります:
Good Morning!Jack You 0 coins left
上記のプログラムでは、greetUser()関数はStringとIntの型の複数のパラメータを受け取り、StringとIntの型の複数の値を返します。
各返り値にアクセスするために、インデックス位置0を使用します。1、…ここでは、msg.0を使用して「Good Morning!Jack」とmsg.1 「0」にアクセスします。
インデックス位置を使用するのは時には直感的で読みにくく、不可読になることがあります。これを解決するために、返り値に名前を付けることでスマートに対応できます。上記のプログラムは以下のように書き換えられます。
func greetUser(name: String, coins: Int) -> (name: String, coins: Int) { let msg = "Good Morning!" + name var userCoins = coins if coins < 0 { userCoins = 0 } return (msg, userCoins) } let msg = greetUser(name: "Jack", coins: -2) print(msg.name) print("You (msg.coins) coins left")
このプログラムでは、元組の戻り値として、その型の変数名を含む変数が戻されます。これにより、msg.nameとmsg.coinsなどの変数名を使用してアクセスすることができます。 に代えて msg.0とmsg.1 結果にアクセスします。
入力を受け入れる関数を定義する際には、パラメータ名の助けにより入力名を定義することができますが、パラメータ名と一緒に使用できる別の名前もあります。それはパラメータタグと呼ばれます。
パラメータタグの使用により、文のように関数を呼び出しながら、読みやすく意図が明確な関数本体を提供することができます。
各関数パラメータにはパラメータタグとパラメータ名があります。デフォルトでは、パラメータはそのパラメータ名を使用してパラメータタグとして使用されますが、パラメータ名を明示的に定義した場合、関数を呼び出す際にはパラメータタグが使用されます。
パラメータタグ付きの関数の構文は以下の通りです
func funcname(argumentLabel parameterName: Type)-> リターン型 { //文 }
以下の例でその点を見てみましょう。
func sum(a:Int, b:Int) -> Int { return a + b } let result = sum(a: 2, b: 3) print("合計は\(result)")
上記のプログラムを実行すると、以下のようになります:
合計は 5
上記の例では、パラメータタグを指定していないため、関数を呼び出す際にはデフォルトパラメータ名aとbがパラメータタグとして使用されます。
関数を呼び出す際に、関数呼び出しが表現的でないことに気づくことがあります。/文。関数呼び出しを設定できる場合があります:
let result = sum(of: 2, and: 3)
今、関数を変更してみましょう:
func sum(of:Int, and:Int) -> Int { return of + and } let result = sum(of: 2, and: 3) print("合計は\(result)")
現在、メソッド呼び出しは表現可能です。ただし、現在ではパラメータ名 of&andを使用し、return of + and を使って2つの数字の和を求めます。これにより、関数本体の可読性が悪くなります。関数本体では aとbを使用して of&andを代用することにより、より意味があります。
これには、パラメータタグを明示的に定義する必要があります:
func sum(of a :Int, and b:Int) -> Int { return a + b } let result = sum(of: 2, and: 3) print("合計は\(result)")
上記のプログラムでは、この関数は Int 型の2つのパラメータを受け取ります。関数呼び出しではパラメータタグ of&andを使用しますが、これは関数 sum(of:の呼び出し時にも意味があります。 2, and: 3))、ではなく sum(a: 2, b: 3)。
また、関数本体ではパラメータ名aとbを使用し、of&andを使用しないことで、アプリケーション操作時もより意味があります。
パラメータ名の前に下線 _ を書くことで、パラメータタグを省略することもできます。
func sum(_ a :Int, _ b:Int) -> Int { return a + b } let result = sum(2, 3) print("合計は\(result)")
関数の任何パラメータにデフォルト値を提供することができます。これは、パラメータのタイプの後に値を割りり当てる方法で行います。デフォルトパラメータの提供は、関数を呼び出す際にパラメータを省略するのに役立ちます。
関数を呼び出す際にパラメータの値を渡さない場合、デフォルト値を使用します。ただし、値を明示的に渡した場合、指定された値を使用します。
func funcname(parameterName:Type = value) -> リターン型 { //文 }
func sum(of a :Int = 7, and b:Int = 8) -> Int { return a + b } let result1 = sum(of: 2, and: 3) print("合計は\(result1)) let result2 = sum(of: 2) print("合計は\(result2)) let result3 = sum(and: 2) print("合計は\(result3)) let result4 = sum() print("合計は\(result4))
上記のプログラムを実行すると、以下のようになります:
合計は 5 合計は 10 合計は 9 合計は 15
上記のプログラムでは、sum(of a :Int =}} 7 , and b:Int = 8) -> Intは、Int型の2つの引数を受け取り、引数a=7とb=8のデフォルト値
関数呼び出しでvalueをパラメータとして渡す場合、sum(of: 2, and: 3)を使用します2と3パラメータのデフォルト値に代わって使用されます。
しかし、パラメータ値をsum()に渡さない場合、デフォルト値が7と8としてパラメータ値を受け取ります。
可変パラメータは、特定のデータ型の0個または複数の値を受け取ることができます。パラメータのデータ型名の後に三つの点(...)を付け加えることで可変パラメータを指定します。
関数呼び出し時に異なる数の入力値をパラメータに渡す必要がある場合、通常可変パラメータを使用します。例えば、数字リスト、文字リストなどです。
可変パラメータを持つ関数の構文は:
func funcname(parameterName:Type...) -> リターン型 { //文 }
func sum(of numbers:Int...) { var result = 0 for num in numbers { result += num } print("数の合計は \(result)") } sum(of: 1, 2, 3, 4, 5, 6, 7, 8)
上記のプログラムでは、sum(of numbers:Int...)という関数はInt型の可変パラメータを受け取ります。可変パラメータは、カンマで区切られた複数の値を受け取ることができます sum(of: 1, 2, 3, 4, 5, 6, 7, 8)。
可変パラメータとして渡された値1、2、3、4、5、6、7、8関数内ではInt型の配列として使用できます。したがって、for-inループはfor num in numbersとして適用されます。
上記のプログラムを実行すると、以下のようになります:
数の合計は 36
注意:Swiftの内蔵のprint()関数は、任意のデータ型の可変パラメータも受け取ります。
Anyは、Swiftでのあらゆるデータ型を表しており、例えばInt、Float、Double、Stringなどがあります。
関数のパラメータを定義する際には、関数内でパラメータを変更することができません。したがって、デフォルトではそれらは定数です。以下の例を確認してください:
func process(name:String) { if name == ""{ name = "guest" } }
上記のプログラムは、パラメータの値を変更できないため、コンパイル時エラーが発生します。
関数がパラメータの値を修正するようにする場合、パラメータをinに定義する必要があります。-outパラメータ。inoutキーワードをパラメータの型の前に置くことで、入力/出力パラメータ。
バックグラウンドで、-outパラメータは、関数に渡され、関数で修正され、元の値を置き換えるために関数から戻される値を持っています。したがって、関数呼び出しで渡される値は定数ではありません。変数として宣言する必要があります。
inoutパラメータを持つファンクションの文法は:
func funcname(parameterName: inout Type) -> リターン型 { //文 }
func process(name: inout String) { if name == ""{ name = "guest" } } var userName = "" process(name: &userName) print(userName)
上記のプログラムを実行すると、以下のようになります:
guest
上記のプログラムでは、ファンクション内で変更できるように、inoutパラメータを受け取るファンクションを宣言しています。/パラメータ name を変更します。
パラメータをinに渡す際に、-outパラメータを使用する場合、変数名の前に直接&記号を使用して、ファンクションが変更できるようにする必要があります。