迅速な機能


Swift 関数は、特定のタスクを完了するために使用される独立したコード ブロックです。

Swift は、統一された構文を使用して、単純な C スタイルの関数を複雑な Objective-C スタイルのメソッドに表現します。

  • 関数宣言: 関数の名前、戻り値の型、パラメーターをコンパイラーに伝えます。

  • 関数定義: 関数の実体を提供します。

Swift 関数には、パラメーターの型と戻り値の型が含まれます。


関数定義

Swift は、キーワード func を使用して関数を定義します。

関数を定義するとき、1 つ以上の入力パラメーターと戻り値の型を指定できます。

各関数には、その機能を説明する関数名があります。この関数は、関数名と対応する型のパラメーター値を通じて呼び出されます。関数のパラメータは、パラメータ リストと同じ順序で渡す必要があります。

関数の実パラメータは仮パラメータリストと同じ順序で渡す必要があり、関数の戻り値の型は->の後に定義されます。

文法

func funcname(形参) -> returntype
{
   Statement1
   Statement2
   ……
   Statement N
   return parameters
}

以下では、php という名前の関数を定義します。仮パラメータのデータ型は String で、戻り値も String です。

import Cocoa

func php(site: String) -> String {
    return site
}
print(php("www.php.cn"))

上記のプログラムの実行の出力結果は次のとおりです。

www.php.cn

関数呼び出し

関数名と対応する型のパラメーター値を使用して関数を呼び出すことができます。関数のパラメーターを渡す順序はパラメーター リストと同じでなければなりません。

以下では、php という名前の関数を定義します。仮パラメータ サイトのデータ型は String です。その後、実際のパラメータが関数本体に渡された後、渡す実際のパラメータも String 型でなければなりません。返されるデータ型は String です。

import Cocoa

func php(site: String) -> String {
    return site
}
print(php("www.php.cn"))

上記のプログラムの実行出力は次のとおりです:

www.php.cn

関数パラメータ

関数は 1 つ以上のパラメータを受け入れることができ、タプルを使用して 1 つ以上のパラメータを関数に渡すこともできます:

import Cocoa

func mult(no1: Int, no2: Int) -> Int {
   return no1*no2
}
print(mult(2, no2:20))
print(mult(3, no2:15))
print(mult(4, no2:30))

上記プログラム 実行出力は次のとおりです:

40
45
120

パラメータなしの関数

パラメータなしで関数を作成できます。

構文:

func funcname() -> datatype {
   return datatype
}

import Cocoa

func sitename() -> String {
    return "php中文网"
}
print(sitename())

上記のプログラム実行出力結果は次のとおりです:

php中文网

関数の戻り値としてのタプル

関数の戻り値の型は文字列、整数、浮動小数点などです。

タプルは配列に似ていますが、タプル内の要素はどのような型でもかっこを使用できる点が異なります。

タプル型を使用すると、関数から複数の値を複合値として返すことができます。

次の例では、minMax(_:) という名前の関数が定義されており、Int 配列の最小値と最大値を見つけるために使用されます。

import Cocoa

func minMax(array: [Int]) -> (min: Int, max: Int) {
    var currentMin = array[0]
    var currentMax = array[0]
    for value in array[1..<array.count] {
        if value < currentMin {
            currentMin = value
        } else if value > currentMax {
            currentMax = value
        }
    }
    return (currentMin, currentMax)
}

let bounds = minMax([8, -6, 2, 109, 3, 71])
print("最小值为 \(bounds.min) ,最大值为 \(bounds.max)")

minMax(_:) 関数は、関数の戻り値をクエリするときに名前でアクセスできるように、min と max というラベルが付いた 2 つの Int 値を含むタプルを返します。

上記のプログラム実行の出力結果は次のとおりです:

最小值为 -6 ,最大值为 109

返されたタプルが nil であってはならないかどうかわからない場合は、オプションのタプル型を返すことができます。

(Int, Int) や (String, Int, Bool)? など、タプル型の閉じ括弧の後に疑問符を置くことで、オプションのタプルを定義できます。

注意
(Int, Int)? などのオプションのタプル型は、(Int?, Int?) などのオプションの型を含むタプルとは異なります。 type の場合、タプル内の各要素の値だけでなく、タプル全体がオプションです。 (Int, Int)?与元组包含可选类型如(Int?, Int?)是不同的.可选的元组类型,整个元组是可选的,而不只是元组中的每个元素值。

前面的minMax(_:)函数返回了一个包含两个Int值的元组。但是函数不会对传入的数组执行任何安全检查,如果array参数是一个空数组,如上定义的minMax(_:)在试图访问array[0]时会触发一个运行时错误。

为了安全地处理这个"空数组"问题,将minMax(_:)函数改写为使用可选元组返回类型,并且当数组为空时返回nil

前の minMax(_:) 関数は、2 つの Int 値を含むタプルを返します。ただし、関数は受信配列に対してセキュリティ チェックを実行しません。array パラメータが空の配列の場合、上記で定義した minMax(_:) はアクセスを試みます。 array[0] は実行時エラーをトリガーします。


この「空の配列」問題を安全に処理するには、オプションのタプル戻り値の型を使用し、配列コードが空の場合に nil を返すように minMax(_:) 関数を書き換えます。 >:

import Cocoa

func minMax(array: [Int]) -> (min: Int, max: Int)? {
    if array.isEmpty { return nil }
    var currentMin = array[0]
    var currentMax = array[0]
    for value in array[1..<array.count] {
        if value < currentMin {
            currentMin = value
        } else if value > currentMax {
            currentMax = value
        }
    }
    return (currentMin, currentMax)
}
if let bounds = minMax([8, -6, 2, 109, 3, 71]) {
    print("最小值为 \(bounds.min),组大值为 \(bounds.max)")
}

上記のプログラム実行出力結果は:

最小值为 -6,组大值为 109

戻り値なし関数


以下はphp(_:)関数の別バージョンです この関数はphpの中国サイト公式サイトのURLパラメータを受け取り、実行します。戻り値を指定せず、文字列値を返す代わりに直接出力します:

import Cocoa

func php(site: String) {
    print("php中文网官网:\(site)")
}
php("http://www.php.cn")

上記のプログラム実行出力結果は次のとおりです:

php中文网官网:http://www.php.cn

関数パラメータ名

関数パラメータには外部パラメータ名とローカルパラメータがあります。名前。

ローカル パラメーター名

ローカル パラメーター名は、関数の実装内で内部的に使用されます。

func sample(number: Int) {
   println(number)
}

上記の例では、number はローカルパラメータ名であり、関数本体内でのみ使用できます。

import Cocoa

func sample(number: Int) {
   print(number)
}
sample(1)
sample(2)
sample(3)

上記のプログラムの実行出力は次のとおりです:

1
2
3

外部パラメータ名

外部パラメータ名は、ローカルパラメータ名の前にスペースで区切って指定できます。外部パラメータ名は、関数に渡されるパラメータに使用されます。関数が呼び出されたとき。

次のように、次の 2 つの関数パラメータ名を定義して呼び出すことができます:

import Cocoa

func pow(firstArg a: Int, secondArg b: Int) -> Int {
   var res = a
   for _ in 1..<b {
      res = res * a
   }
   print(res)
   return res
}
pow(firstArg:5, secondArg:3)

上記のプログラム実行出力は次のとおりです:

125

外部パラメータ名を指定する場合、関数は外部パラメータ名を使用する必要があります。パラメータ名と呼ばれる場合。

可変個引数パラメーター

可変個引数パラメーターは、0 個以上の値を受け入れることができます。関数を呼び出す場合、変数パラメータを使用して関数パラメータを指定できますが、その数は不定です。


変数パラメータは、変数型名の後に(...)を追加して定義します。

import Cocoa

func vari<N>(members: N...){
    for i in members {
        print(i)
    }
}
vari(4,3,5)
vari(4.5, 3.1, 5.6)
vari("Google", "Baidu", "php")

上記のプログラム実行出力結果は次のとおりです:

4
3
5
4.5
3.1
5.6
Google
Baidu
php

定数、変数、および I/O パラメータ

一般に、関数で定義されたパラメータはデフォルトで定数パラメータです。つまり、このパラメータはクエリと使用のみ可能です。 、値を変更することはできません。

変数パラメータを宣言したい場合は、前に var を追加すると、パラメータの値を変更できます。

例:

func  getName(var id:String).........
🎜このとき、関数内でid値を変更することができます。 🎜🎜一般に、デフォルトのパラメーターの受け渡しは、参照ではなく値によって呼び出されます。 したがって、渡されるパラメータは関数内で変更され、元のパラメータには影響しません。渡されるのは、このパラメーターの単なるコピーです。 🎜

上記のように、変数パラメーターは関数本体内でのみ変更できます。関数でパラメータの値を変更し、その変更を関数の呼び出し後も保持したい場合は、パラメータを In-Out パラメータとして定義する必要があります。

入出力パラメータを定義する場合は、パラメータ定義の前に inout キーワードを追加します。入出力パラメータには関数に渡される値があり、この値は関数によって変更され、その後関数から渡されて、元の値が置き換えられます。

import Cocoa

func swapTwoInts(var a:Int,var b:Int){
    
    let t = a
    a = b
    b = t
}

var x = 0,y = 100
print("x = \(x) ;y = \(y)")

swapTwoInts(x, b:y)
print("x = \(x) ;y = \(y)")

上記プログラムの実行結果の出力結果は、

x = 0 ;y = 100
x = 0 ;y = 100
<pこのとき渡されるパラメータは元の値のコピーなので、この関数は2つの値を交換しません。 < p="">

変更方法は inout キーワードを使用することです:

import Cocoa

func swapTwoInts(inout a:Int,inout b:Int){
    
    let t = a
    a = b
    b = t
}

var x = 0,y = 100
print("x = \(x) ;y = \(y)")

swapTwoInts(&x, b:&y)
print("x = \(x) ;y = \(y)")

上記のプログラム実行の出力結果は次のとおりです:

x = 0 ;y = 100
x = 100 ;y = 0

関数の種類と使用法

各関数には特定の関数の種類があり、これは関数によって決定され、パラメータの型と戻り値の型で構成されます。

func inputs(no1: Int, no2: Int) -> Int {
   return no1/no2
}

例は次のとおりです:

import Cocoa

func inputs(no1: Int, no2: Int) -> Int {
    return no1/no2
}
print(inputs(20,no2:10))
print(inputs(36,no2:6))

上記プログラムの実行出力は次のとおりです:

2
6

上記の関数は 2 つの Int パラメータ型を定義しており、戻り値も Int 型です。

次に、次の関数を見てみましょう。この関数は、パラメーターを String 型として定義し、戻り値を String 型として定義します。

Func inputstr(name: String) -> String {
   return name
}

関数は、以下に示すように、任意のパラメーターと型を定義することもできます:

import Cocoa

func inputstr() {
   print("php中文网")
   print("www.php.cn")
}
inputstr()

上記のプログラム実行の出力結果は次のとおりです:

php中文网
www.php.cn

関数型の使用

Swift では、関数型の使用は他の型の使用と同じです。たとえば、関数型の定数または変数を定義し、それに適切な関数を割り当てることができます:

var addition: (Int, Int) -> Int = sum

解析:

"パラメーターと戻り値の型を使用して、addition という名前の変数を定義します。両方ともInt を指定し、この新しい変数が sum 関数を指すようにします。」 addition 的变量,参数与返回值类型均是 Int ,并让这个新变量指向 sum 函数"。

sumaddition

sumaddition は同じ型なので、上記の演算は正当です。

これで、加算を使用して割り当てられた関数を呼び出すことができます:

import Cocoa

func sum(a: Int, b: Int) -> Int {
   return a + b
}
var addition: (Int, Int) -> Int = sum
print("输出结果: \(addition(40, 89))")

上記のプログラムの実行出力は次のとおりです:
输出结果: 129

関数の型はパラメーターの型として使用され、関数の型は戻り値の型として使用されます

関数をパラメータとして渡すことができます 別のパラメータを指定します:

import Cocoa

func sum(a: Int, b: Int) -> Int {
    return a + b
}
var addition: (Int, Int) -> Int = sum
print("输出结果: \(addition(40, 89))")

func another(addition: (Int, Int) -> Int, a: Int, b: Int) {
    print("输出结果: \(addition(a, b))")
}
another(sum, a: 10, b: 20)

上記のプログラムの実行出力は次のとおりです:
输出结果: 129
输出结果: 30

関数のネスト

関数のネストとは、関数内で新しい関数を定義することを指し、外部関数は関数内で定義された関数を呼び出します。

例は次のとおりです:

import Cocoa

func calcDecrement(forDecrement total: Int) -> () -> Int {
   var overallDecrement = 0
   func decrementer() -> Int {
      overallDecrement -= total
      return overallDecrement
   }
   return decrementer
}
let decrem = calcDecrement(forDecrement: 30)
print(decrem())

上記のプログラムの実行の出力結果は次のとおりです:
-30
🎜