[swiftベース]関数


swiftの関数は1級オブジェクトであり、データ型として使用できます.関数はデータ型として使用できます.これは、関数を伝達パラメータとして受信したり、戻り値を返したりできることを意味します.
毛教授が言ったように、C言語は一般宣言と関数宣言の継続であり、一つのプログラムは大きな関数と言える.
💡 関数とメソッド
基本的には,関数自体は変化しないが,場合や位置によっては異なる用語で呼ぶ.
  • 関数-全モジュールのグローバル使用可能関数
  • メソッド-構造体、クラス、列挙タイプを含む特定のタイプに関連付けられた関数
  • 💡 関数の定義と呼び出し
    条件文または繰返し文でカッコを省略できるのとは異なり、関数でカッコを省略することはできません.
    swiftの関数は、再定義(override)と重複定義(overload)の両方をサポートします.すなわち、異なるタイプのパラメータを持つ同名の関数と、異なる数のパラメータを持つ同名の関数を作成することができる.
    関数の基本形式は以下の通りです.
    func 함수 이름(매개변수...) -> 반환 타입 {
        실행 구문
        return 반환 값
    }
    func hello(name: String) -> String {
        return"Hello \(name)"
        //"Hello \(name)"
    }
    
    let name: String = hello(name: "silverCastle")
    print(name)
    
    結果
    Hello silverCastle
    パラメータのない関数
    // 매개변수가 필요 없는 함수라면 매개변수 위치를 공란으로 비워두자.
    func hello() -> String {
        return "Hello silverCastle"
    }
    print(hello())
    結果
    Hello silverCastle
    複数のパラメータを持つ関数
    複数のパラメータが必要な場合は、パラメータをカンマで区切って複数のパラメータを定義できます.
    func hello(from myName: String, to yourName: String) -> String {
        return "Hello, \(yourName)! I'm \(myName)"
    }
    print(hello(from: "silverCastle", to: "goldCastle"))
    結果
    Hello, goldCastle! I'm silverCastle
    
    ▼▼▼パラメータ名と伝達パラメータラベル
    関数を呼び出すときにパラメータ名を使用します.また、関数を呼び出すときに使用するパラメータラベルを指定することもできます.
    パラメータ名とパラメータラベルを渡す形式を指定します.
    func 함수 이름(전달인자 레이블 매개변수 이름: 매개변수 타입, 전달인자 레이블 매개변수 이름: 매개변수 타입...) -> 반환 타입 {
        실행 구문
        return 반환 값
    }
    すなわち,関数内部で伝達パラメータラベルを使用することも,関数呼び出し時にパラメータ名を使用することもできない.
    C言語のように伝達パラメータラベルを使いたくないなら?
    ワイルドカードを使用して関数を呼び出す場合、C言語のように呼び出すことができます.
    ▼▼▼パラメータデフォルト
    パラメータのデフォルト値を指定することもできます.パラメータが渡されていない場合は、デフォルト値が使用されます.
    ▼▼▼可変パラメータとI/Oパラメータ
    パラメータの値が分からない場合は、可変パラメータを使用します.このとき得られる範囲は0個以上である.
    func hello(me: String, friends: String...) -> String {
        var result: String = ""
        for friend in friends {
            result += "Hello " + friend + "! "
        }
        return "I'm " + me + result
    }
    print(hello(me: "silverCastle ",friends: "bronzeCastle","goldCastle","platinumCastle"))
    
    結果
    I'm silverCastle Hello bronzeCastle! Hello goldCastle! Hello platinumCastle! 
    値を関数の伝達パラメータとして伝達する場合、通常は値をコピーして伝達しますが、値以外の参照を伝達する場合はI/Oパラメータを使用する必要があります.
    C言語のポインタのように値タイプデータの参照を伝達パラメータとして送信する場合は、関数の内部で参照して元の値を変更します.参照inoutで変数として渡される変数または定数の前に&表示を付けます.
    var numbers: [Int] = [1, 2, 3]
    func nonReferenceParameter(arr: [Int]) {
        var copiedArr: [Int] = arr
        copiedArr[1] = 100
    }
    func referenceParameter(arr: inout [Int]) {
        arr[1] = 100
    }
    nonReferenceParameter(arr: numbers)
    print("참조하지 않은 결과: ", numbers[1])
    referenceParameter(arr: &numbers)
    print("참조한 결과: ", numbers[1])
    
    結果
    참조하지 않은 결과:  2
    참조한 결과:  100
    
    返されない関数
    値を返す必要のない関数がよくあります.この場合、戻りタイプをvoidと表記するか、戻りタイプ表憲を省略する.
    func hello() {
        print("hello, swift world!")
    }
    hello()
    
    結果
    hello, swift world!
    
    データ型の関数として
    パラメータタイプと戻りタイプからなるタイプとして使用できます.
    typealias CaculateTwoInts = (Int, Int) -> Int
    
    func add (a: Int, b: Int) -> Int {
        return a+b
    }
    func multiple (a: Int, b: Int) -> Int {
        return a*b
    }
    
    var number: CaculateTwoInts = add
    print(number(10, 20))
    number = multiple
    print(number(10, 20))
    
    結果
    30
    200
    
    ▼▼重ね合わせ関数
    関数のオーバーラップは、関数に関数を追加できることを意味します.これまでの例は、モジュールの任意の場所で使用できるグローバル関数です.ただし、関数内の関数によって実現される重畳関数は、親関数のボディブロック内部でのみ関数を使用できます.(もちろん、外部では利用できないわけではありません.)
    次の例は、原点0に移動する関数の実装です.
    typealias MoveFunc = (Int) -> Int
    
    func moveToZero (_ shouldGoLeft: Bool) -> MoveFunc {
        func goRight(_ position: Int) -> Int {
            return position + 1
        }
        func goLeft(_ position: Int) -> Int {
            return position - 1
        }
        return shouldGoLeft ? goLeft : goRight
    }
    
    var position: Int = 5
    let goZero: MoveFunc = moveToZero(position > 0)
    while position != 0 {
        print(position)
        position = goZero(position)
    }
    print("원점 도착!")
    結果
    5
    4
    3
    2
    1
    원점 도착!
    
    ▼▼非終端関数
    终わらないのは正常に终わらないという意味です.すなわち,エラーや重大なシステムエラーを投げ出したいと報告する方法を非戻り関数または非戻り方法と呼ぶ.
    非戻り関数は、戻りタイプをNeverとして指定するだけです.
    func crash() -> Never {
        fatalError("Something wrong!")
    }
    crash()
    
    結果
    __lldb_expr_54/MyPlayground.playground:84: Fatal error: Something wrong!