English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Swift ファンクションの引数と戻り値

この記事では、異なるタイプの入力を取得し、出力を返すユーザー定義関数について学びます。

前回の記事Swift関数内、関数について学びました。今度は、Swiftで関数を作成するさまざまな方法とタイプ、すなわち関数内で入力と出力を処理する方法について探求します。

引数がないかつ返り値もない関数

これらのタイプの関数は何も入力や返り値を受け取らない。

func funcname() {
    //文
}
または
func funcname() -> () {
    //文
}
または
func funcname() -> Void {
    //文
}

これらの语法は、引数を持ち、返り値を持たない関数を作成するためにはすべて有効です。

上記の语法 func funcname()->()も func funcname() と同義です。->void、voidは()の型別名に過ぎません。以下を参照してアクセスできますSwiftの型別名詳細については、こちらを参照してください。

例1:引数を渡さず、返り値もない

func greetUser() {
    print("Good Morning!")
}
greetUser()

上記のプログラムを実行すると、以下のようになります:

Good Morning!

引数がないが返り値がある関数

これらのタイプの関数は何も入力パラメータを受け取りませんが、値を返します。返り値のタイプを追加するには、矢印(-)と返り値のタイプ。

func funcname() -> ReturnType {
    //文
    return value
}

例2:引数を渡さずに返り値を返す

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) {
    //文
}

例3:引数の渡しのみで返り値はありません

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 {
    //文
}

例4:引数を渡し、値を返します

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...) {
    //文
}

例5:複数の引数と複数の返り値を渡します

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」にアクセスします。

インデックス位置を使用するのは時には直感的で読みにくく、不可読になることがあります。これを解決するために、返り値に名前を付けることでスマートに対応できます。上記のプログラムは以下のように書き換えられます。

例6:複数の返り値を持つ名前付きの返り値

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)-> リターン型 {
    //文
}

以下の例でその点を見てみましょう。

例7:パラメータタグを持たない関数

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)

今、関数を変更してみましょう:

例8:より良い関数呼び出しの機能を持ちつつ、パラメータ名として使用しない関数

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を代用することにより、より意味があります。

これには、パラメータタグを明示的に定義する必要があります:

例9:パラメータタグを持つ関数

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) -> リターン型 {
    //文
}

例10:デフォルトパラメータ値を持つ関数

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)を使用します23パラメータのデフォルト値に代わって使用されます。

しかし、パラメータ値をsum()に渡さない場合、デフォルト値が7と8としてパラメータ値を受け取ります。

可変パラメータを持つ関数

可変パラメータは、特定のデータ型の0個または複数の値を受け取ることができます。パラメータのデータ型名の後に三つの点(...)を付け加えることで可変パラメータを指定します。

関数呼び出し時に異なる数の入力値をパラメータに渡す必要がある場合、通常可変パラメータを使用します。例えば、数字リスト、文字リストなどです。

可変パラメータを持つ関数の構文は:

func funcname(parameterName:Type...) -> リターン型 {
    //文
}

例11:可変パラメータを持つ関数

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) -> リターン型 {
    //文
}

例12:inoutパラメータを持つファンクション

func process(name: inout String) { 
    if name == ""{
        name = "guest"
    }
}
var userName = ""
process(name: &userName)
print(userName)

上記のプログラムを実行すると、以下のようになります:

guest

上記のプログラムでは、ファンクション内で変更できるように、inoutパラメータを受け取るファンクションを宣言しています。/パラメータ name を変更します。

パラメータをinに渡す際に、-outパラメータを使用する場合、変数名の前に直接&記号を使用して、ファンクションが変更できるようにする必要があります。