Swift-functions
Swift-関数
関数は、特定のタスクを実行するためにまとめられた一連のステートメントです。 Swift 4の関数は、単純なC関数のように単純なものから、Objective C言語の関数のように複雑なものまであります。 関数呼び出し内でローカルおよびグローバルのパラメーター値を渡すことができます。
- 関数宣言-コンパイラーに関数の名前、戻り値の型、およびパラメーターについて通知します。
- 関数の定義-関数の実際の本体を提供します。
Swift 4の関数には、パラメーター型とその戻り値の型が含まれています。
関数定義
Swift 4では、関数は「func」キーワードによって定義されます。 関数が新しく定義されると、関数への入力「パラメーター」として1つまたは複数の値を取り、本体の関数を処理し、値を出力「戻り型」として関数に返します。
すべての関数には関数名があり、関数が実行するタスクを説明しています。 関数を使用するには、その関数をその名前で「呼び出し」、関数のパラメーターのタイプに一致する入力値(引数)を渡します。 関数パラメーターは「タプル」とも呼ばれます。
関数の引数は、常に関数のパラメーターリストと同じ順序で指定する必要があり、戻り値の後には→が続きます。
構文
func funcname(Parameters) -> returntype {
Statement1
Statement2
---
Statement N
return parameters
}
次のコードを見てください。 学生の名前は、関数 'student’内で宣言された文字列データ型として宣言され、関数が呼び出されると、学生の名前が返されます。
func student(name: String) -> String {
return name
}
print(student(name: "First Program"))
print(student(name: "About Functions"))
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
First Program
About Functions
関数を呼び出す
たとえば、関数名が「display」の関数が整数データ型を保持する引数「no1」で初期化される数値を表示することを検討するために、「display」と呼ばれる関数を定義したとします。 次に、引数 'no1’が引数 'a’に割り当てられ、以降は同じデータ型の整数を指します。 これで、引数 'a’が関数に返されます。 ここで、display()関数は整数値を保持し、関数が呼び出されるたびに整数値を返します。
func display(no1: Int) -> Int {
let a = no1
return a
}
print(display(no1: 100))
print(display(no1: 200))
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
100
200
パラメータと戻り値
Swift 4は、単純な値から複雑な値まで、柔軟な関数パラメーターとその戻り値を提供します。 CおよびObjective Cの関数と同様に、Swift 4の関数もいくつかの形式を取ります。
パラメータ付き関数
関数にアクセスするには、そのパラメーター値を関数の本体に渡します。 関数内でタプルとして単一から複数のパラメーター値を渡すことができます。
func mult(no1: Int, no2: Int) -> Int {
return no1*no2
}
print(mult(no1: 2, no2: 20))
print(mult(no1: 3, no2: 15))
print(mult(no1: 4, no2: 30))
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
40
45
120
パラメータなしの関数
パラメータのない関数もあります。
構文
func funcname() -> datatype {
return datatype
}
以下は、パラメータなしの関数を持つ例です-
func votersname() -> String {
return "Alice"
}
print(votersname())
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
Alice
戻り値を持つ関数
関数は、文字列、整数、および浮動小数点データ型の値を戻り値の型として返すためにも使用されます。 与えられた配列の最大数と最小数を見つけるために、「ls」は大小の整数データ型で宣言されています。
配列は整数値を保持するために初期化されます。 次に、配列が処理され、配列内のすべての値が読み取られ、前の値と比較されます。 値が前の値よりも小さい場合は「small」引数に格納され、それ以外の場合は「large」引数に格納され、関数を呼び出して値が返されます。
func ls(array: [Int]) -> (large: Int, small: Int) {
var lar = array[0]
var sma = array[0]
for i in array[1..<array.count] {
if i < sma {
sma = i
} else if i > lar {
lar = i
}
}
return (lar, sma)
}
let num = ls(array: [40,12,-5,78,98])
print("Largest number is: \(num.large) and smallest number is: \(num.small)")
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
Largest number is: 98 and smallest number is: -5
戻り値のない関数
一部の関数は、戻り値なしで関数内で宣言された引数を持つ場合があります。 次のプログラムは、 a および b をsum()関数の引数として宣言します。 関数自体の内部で、引数 a および b の値は、関数呼び出しsum()を呼び出すことで渡され、その値が出力されるため、戻り値が削除されます。
func sum(a: Int, b: Int) {
let a = a + b
let b = a - b
print(a, b)
}
sum(a: 20, b: 10)
sum(a: 40, b: 10)
sum(a: 24, b: 6)
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
30 20
50 40
30 24
オプションの戻り値型を持つ関数
Swift 4は、安全対策を導入することで問題を取り除くための「オプション」機能を導入しています。 例えば、関数値が整数として返されるタイプを宣言しているが、関数が文字列値またはnil値を返すとどうなるかを考えてみましょう。 その場合、コンパイラはエラー値を返します。 これらの問題を取り除くために「オプション」が導入されています。
オプションの関数は、「値」と「nil」の2つの形式を取ります。 キーの予約文字「?」とともに「オプション」に言及します。タプルが値を返すか、nil値を返すかを確認します。
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(array: [8, -6, 2, 109, 3, 71]) {
print("min is \(bounds.min) and max is \(bounds.max)")
}
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
min is -6 and max is 109
「オプション」は、「nil」値またはガベージ値をチェックするために使用されるため、デバッグに多くの時間を消費し、ユーザーにとってコードを効率的かつ読みやすくします。
関数ローカルと外部パラメーター名
ローカルパラメータ名
ローカルパラメータ名は、関数内でのみアクセスされます。
func sample(number: Int) {
print(number)
}
ここで、 func サンプル引数番号は、関数sample()によって内部的にアクセスされるため、内部変数として宣言されます。 ここで、「番号」はローカル変数として宣言されていますが、変数への参照は次のステートメントで関数の外部で行われます-
func sample(number: Int) {
print(number)
}
sample(number: 1)
sample(number: 2)
sample(number: 3)
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
1
2
3
外部パラメーター名
外部パラメーター名を使用すると、目的をより明確にするために関数パラメーターに名前を付けることができます。 以下の例では、2つの関数パラメータに名前を付けて、その関数を次のように呼び出すことができます-
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
可変パラメータ
複数の引数を使用して関数を定義する場合、メンバーを「変数」パラメーターとして宣言できます。 パラメーターは、パラメーター名の後に(…)によって可変引数として指定できます。
func vari<N>(members: N...){
for i in members {
print(i)
}
}
vari(members: 4,3,5)
vari(members: 4.5, 3.1, 5.6)
vari(members: "Swift 4", "Enumerations", "Closures")
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
4
3
5
4.5
3.1
5.6
Swift 4
Enumerations
Closures
定数、変数、I/Oパラメーター
デフォルトでは、関数はパラメーターを「定数」と見なしますが、ユーザーは関数の引数を変数として宣言することもできます。 「let」キーワードを使用して定数パラメーターを宣言し、変数パラメーターを「var」キーワードで定義することはすでに説明しました。
Swift 4のI/Oパラメーターは、関数呼び出し後に値が変更されてもパラメーター値を保持する機能を提供します。 関数パラメーター定義の最初に、メンバー値を保持するために「inout」キーワードが宣言されます。
値は関数に「in」で渡され、その値は関数本体によってアクセスおよび変更され、元の引数を変更するために関数の「out」に戻されるため、キーワード「inout」を派生させます。
変数は、値だけが関数の内外で変更されるため、in-outパラメーターの引数としてのみ渡されます。 したがって、文字列とリテラルを入出力パラメータとして宣言する必要はありません。 変数名の前の「&」は、引数を入出力パラメーターに渡していることを示します。
func temp(a1: inout Int, b1: inout Int) {
let t = a1
a1 = b1
b1 = t
}
var no = 2
var co = 10
temp(a1: &no, b1: &co)
print("Swapped values are \(no), \(co)")
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
Swapped values are 10, 2
関数の種類とその使用法
各パラメーターは、入力パラメーターを考慮して特定の機能に従い、目的の結果を出力します。
func inputs(no1: Int, no2: Int) -> Int {
return no1/no2
}
以下は例です-
func inputs(no1: Int, no2: Int) -> Int {
return no1/no2
}
print(inputs(no1: 20, no2: 10))
print(inputs(no1: 36, no2: 6))
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
2
6
ここでは、関数は整数データ型として2つの引数 no1 および no2 で初期化され、その戻り値の型も 'int’として宣言されています
Func inputstr(name: String) -> String {
return name
}
ここでは、関数は string データ型として宣言されています。
関数には void データ型もあり、そのような関数は何も返しません。
func inputstr() {
print("Swift 4 Functions")
print("Types and its Usage")
}
inputstr()
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
Swift 4 Functions
Types and its Usage
上記の関数は、引数も戻り値もないvoid関数として宣言されています。
関数型を使用する
関数は、最初に整数、フロート、または文字列型の引数で渡され、次に定数または変数として関数に渡されます。これについては以下で説明します。
var addition: (Int, Int) -> Int = sum
ここで、sumは 'a’および 'b’整数変数を持つ関数名であり、関数名追加の変数として宣言されています。 これ以降、加算関数と合計関数の両方に、整数データ型として宣言された同じ数の引数があり、参照として整数値も返します。
func sum(a: Int, b: Int) -> Int {
return a + b
}
var addition: (Int, Int) -> Int = sum
print("Result: \(addition(40, 89))")
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
Result: 129
パラメータ型および戻り値型としての関数型
関数自体をパラメーター型として別の関数に渡すこともできます。
func sum(a: Int, b: Int) -> Int {
return a + b
}
var addition: (Int, Int) -> Int = sum
print("Result: \(addition(40, 89))")
func another(addition: (Int, Int) -> Int, a: Int, b: Int) {
print("Result: \(addition(a, b))")
}
another(sum, 10, 20)
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
Result: 129
Result: 30
入れ子関数
ネストされた関数は、内部関数を呼び出すことにより外部関数を呼び出す機能を提供します。
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