[SWIFTプログラミング-7章]関数


この文章はSWIFTプログラミング(3版、野熊の音)を読んで簡単にまとめたものです.本には親切な説明と関連するサンプルコードがあるので、自分で買って読むことをお勧めします.

7.0概要


関数は仕事の最小単位であり、小さなプログラムでもあります.

7.1関数と方法


関数とメソッドは基本的に同じですが、状況や位置によって異なります.特定のタイプに関連付けられた関数(構造体、クラス、列挙型など)を関数と呼び、メソッドおよびモジュール全体でグローバルに使用される関数を関数と呼びます.

7.2関数の定義と呼び出し


swiftの関数は条件文や繰返し文とは異なり、関数ではカッコを省略することはできません.再定義(overlight)と繰返し定義(overload)をサポートします.したがって、パラメータのタイプや個数が異なる場合は、複数の同名関数を作成できます.

7.2.1基本関数の定義と呼び出し


関数は、関数の名前、パラメータ(パラメータ)、戻りタイプなどとして定義されます.関数を定義するキーワードはfuncで、返されるキーワードはreturnです.
関数内のコードが1行しかなく、実行結果値が戻りタイプと一致している場合は、returnキーワードを省略できます.
func 함수 이름(매개 변수: 매개 변수 타입, ...) -> 반환 타입 {
    실행 구문
    return 반환 값
}
func 함수 이름(매개 변수: 매개 변수 타입, ...) -> 반환 타입 {
    반환 값
}

パラメータと伝達パラメータ?


パラメータは、関数を定義するときに外部から受け取る伝達値の名前です.伝達パラメータまたはパラメータは、実際に関数を呼び出すときに伝達される値を表します.hello(name:“Lee”)ではパラメータがname、伝達パラメータが“Lee”となります.

7.2.2パラメータ


sweetの関数はパラメータによって形状と機能がどのように異なるかを理解しましょう.

複数のパラメータがありません


関数にパラメータがない場合は空です.
func hello() -> String {
    return "Hello"
}

hello()
パラメータが複数の場合は、カンマ(,)で区切ります.関数を呼び出すと、パラメータ名とその横にコロン(:)を付け、伝達パラメータを送信します.
func hello(myName: String, yourName: String) -> String {
    return "Hello, \(yourName)! Im \(myName)."
}

hello(myName: "Lee", yourName: "Hee") // "Hello, Hee! Im Lee."

パラメータ名と伝達パラメータラベル


伝達パラメータイラブを指定することもできます.hello関数にはfromとtoという転送パラメータラベルがあり、myNameとyourNameというパラメータ名があります.
func hello(from myName: String, to yourName: String) -> String {
    return "Hello, \(yourName)! Im \(myName)."
}

hello(from: "Lee", to: "Hee") // "Hello, Hee! Im Lee."

転送パラメータラベルをスキップ

func hello(_ myName: String, _ yourName: String) -> String {
    return "Hello, \(yourName)! Im \(myName)."
}

hello("Lee", "Hee") // "Hello, Hee! Im Lee."

パラメータデフォルト


パラメータのデフォルト値を指定することもできます.デフォルト値のないパラメータは、重要な値が関数に渡される可能性が高いため、前に書きます.
func hello(_ myName: String, _ yourName: String = "Unknown") -> String {
    return "Hello, \(yourName)! Im \(myName)."
}

hello("Lee") // "Hello, Unknown! Im Lee."

可変パラメータとI/Oパラメータ


パラメータの値が分からない場合は、可変パラメータを使用します.0以上の値を受け入れることができます.各関数は1つしかありません.
func hello(names: String...) -> String {
    return names.map({ "Hello, " + $0 + "! " }).reduce("", +)
}

hello(names: "A", "B", "C") // "Hello, A! Hello, B! Hello, C! "

参照を渡すI/Oパラメータ


関数の伝達因子として値を伝達する場合、通常は値をコピーすることによって伝達される.非値参照を渡すには、I/Oパラメータを使用します.この方法が関数外部の値にどのような影響を及ぼすか分からないため,関数型プログラミングモードの使用は避ける.I/Oパラメータの伝達順序は以下の通りです.
  • 関数が呼び出されると、伝達パラメータの値がコピーされます.
  • に対応する伝達パラメータの値を変更すると、関数内で1からコピーされた内容が変更されます.
  • 関数を返すと、2で変更した値が元のパラメータに割り当てられます.
  • inoutパラメータとして渡される変数または定数の前に和(&)を付けて表します.
    var name: String = "Lee"
    
    func hello(name: inout String) -> String {
        name = "Kim"
        return "Hello, \(name)!"
    }
    
    print(name) // Lee
    hello(name: &name) // Hello, Kim!
    print(name) // Kim

    7.2.3戻り関数なし


    関数に戻りタイプがない場合は、ないvoidをマークしたり、戻りタイプの表示を省略したりすることができます.
    func hello() -> Void {
        print("Hello")
    }
    
    hello() // Hello
    func hello() {
        print("Hello")
    }
    
    hello() // Hello

    7.2.4データ型の関数


    sweeftの関数は1級オブジェクトであり、データ型として使用できます.
    (매개변수 타입의 나열) -> 반환 타입
    func hello(myName: String, yourName: String) -> String {
        return "Hello, \(yourName)! Im \(myName)."
    }
    
    // 함수 타입: (String, String) -> String
    func hello() {
        print("Hello")
    }
    
    // 함수 타입: Void -> Void

    関数の簡略表示


    関数を簡略化する場合は、hello(myName,yourName)などの名前や水稲数などで表現できます.

    関数のタイプの使用


    伝達パラメータラベルは、関数タイプのコンポーネントではないため、関数タイプの作成時に伝達パラメータラベルを書き込むことはできません.
    typealias HelloNames = (String, String) -> String
    
    func hello(_ myName: String, _ yourName: String) -> String {
        return "Hello, \(yourName)! Im \(myName)."
    }
    
    var newFuntion: HelloNames = hello
    
    newFuntion("Lee", "Hee") // "Hello, Hee! Im Lee."

    7.3ネスト関数


    swiftはデータ型を自由にオーバーラップさせることができる.列挙型に列挙型を加えてもよいし、クラスにクラスを加えてもよい.関数に関数がある可能性があります.定義された上位ブロックの内部でのみ使用できます.
    typealias MoveFunc = (Int) -> Int
    
    func functionForMove(_ shouldGoLeft: Bool) -> MoveFunc {
        func goLeft(_ position: Int) -> Int {
            return position - 1
        }
        func goRight(_ position: Int) -> Int {
            return position + 1
        }
        
        return shouldGoLeft ? goLeft : goRight
    }
    
    var position = -4
    let moveToZero: MoveFunc = functionForMove(position > 0) // goRight 함수가 된다.
    
    while position < 0 {
        print(position) // -4 -3 -2 -1
        position = moveToZero(position)
    }
    
    print(position) // 0

    7.4未終了の関数


    swiftには終了しない関数があります.正常に終わらないことを意味します.これを非戻り関数または非戻りメソッドと呼びます.エラーを投げ出したり、重大なシステムエラーを報告したりして、プロセスを終了します.非戻りタイプ(メソッド)は、戻りタイプをNeverとして指定するだけです.
    func crashAndBurn() -> Never {
        fatalError("에러 발생!")
    }

    7.5戻り値を無視できる関数


    必ずしも値を返す必要がない場合があります.この場合、@DiscardableResultを使用して、属性無視関数の戻り値を宣言できます.次のコードでは戻り値が使用されていないため、コンパイラに警告が表示される場合があります.このとき@discardableResultを使用して属性を宣言します.
    @discardableResult func hello(_ name: String) -> String {
        print("Hello, \(name)")
        return "Hello, \(name)"
    }
    
    hello("Lee")