見出し画像

Lesson 2.2 Functions

前のレッスンでは、印刷などの既存の機能を使用してタスクを実行する方法を学びました。
そのような場合、関数がどのように実装されたかの詳細について心配する必要はありませんでした。それはうまくいきました。
ただし、保守可能で再利用可能なコードを記述したい場合は、独自の関数を作成できる必要があります。 
このレッスンでは、抽象化の重要性をよりよく理解しながら、さまざまなパラメーターと戻り値タイプを使用して関数を宣言する方法を学習します。 
あなたが学ぶこと 
・リターンタイプの有無にかかわらず、独自の関数を作成する方法 関数の入力パラメーターを指定する方法 

・必要に応じて複数の値を返す方法 関数の呼び出し方法をカスタマイズする方法  

・関数にデフォルトのパラメータ値を提供する方法 

“Vocabulary
argument label
parameter
return type
return value

p.126 
誰かがあなたに「服を着る」というタスクを与えるとき、それはとても簡単な指示のように思えます。
しかし、何を着るか、どのように服を着るか、どこから服を手に入れるかの詳細はすべて「服を着る」フレーズに包まれています。複雑なものを取り、それを参照するより簡単な方法を定義するという考えは抽象化であり、関数はコードで抽象化を作成する基本的な方法の1つです。

関数は、その名前、オプションのパラメータリスト、およびオプションの戻り値タイプの3つで構成されています。
関数を呼び出すことは、電話をかけるのと似ています。情報(パラメータ)を渡すことはできますが、情報を取り戻すこともできます(戻り値)。
Swiftの関数は、ゼロ、1、または複数のパラメータを取ることができますが、ゼロ、1、または複数の値を返すこともできます。
関数が値を返す場合、それを無視するオプションがあります。

Let を持つ定数や var を持つ変数の宣言と同様に、func キーワードは関数を宣言していることを Swift コンパイラに伝えます。Funcの直後に、関数の名前を追加し、その後に括弧()が続きます。 

関数の定義
func functionName (parameters) -> ReturnType {
  //body of the function 
}

あなたの毎日のルーチンについて考えてください。
靴を結んだり、朝食を作ったり、仕事や学校への運転など、毎日実行する反復的なタスクをたくさん特定できるでしょう。
これらのタスクの中には、追加の入力を必要としないものもあります。あなたは毎回同じように靴を結びます。入力のない関数の場合、関数パラメータはありません。

tieMyShoes() 

ただし、各朝食には材料のリストが含まれている場合があります。したがって、関数を呼び出すときにパラメータを使用してリストを指定します。

makeBreakfast(food: ["eggs", "orange juice"])
makeBreakfast(food: ["cereal", "toast"])  

p.127 
以下は、pi(π)の最初の10桁を表示する関数の例です。印刷パイは追加の入力を必要としないため、パラメータはありません。
また、print円周率は関数呼び出し元に関連するものを返す必要がないため、戻り値は指定されていません。

func displayPi() {
  print("3.1415926535")
}

関数が適切に宣言されたら、その名前を書くだけでどこからでも呼び出すか、実行できます。

displayPi()

Console Output:
3.1415926535 

パラメータ
パラメータを持つ関数を指定するには、値の名前、コロン(:)、および値の型をすべて括弧内に挿入します。たとえば、Intを取り込み、値を3倍にして印刷するトリプルという関数を書きたいとします。
func triple(value: Int) {
  let result = value * 3
  print("If you multiply \(value) by 3, you'll get \(result).")
}

p.128
 上記の場合、値は関数内で使用できる定数です。

“triple(value: 10)
Console Output:
If you multiply 10 by 3, you'll get 30. 

関数に複数の引数を渡すには、各パラメータをカンマ(,)で区切る必要があります。以下は、2つのIntパラメータを取り込み、それらを乗算し、結果を出力する関数の例です。

 func multiply(firstNumber: Int, secondNumber: Int) {
  let result = firstNumber * secondNumber
  print("The result is \(result).")
}

その後、関数は次のように呼び出されます。

multiply(firstNumber: 10, secondNumber: 5)

Console Output:
The result is 50.

引数ラベル
これまでのところ、関数内の各引数のラベルは、外部と同じ名前です。関数内と関数が呼び出されたときの両方にfirstNameが使用される次の例を考えてみましょう。

func sayHello(firstName: String) {
  print("Hello, \(firstName)!")
}
 
p.129

sayHello(firstName: "Aidyn")

しかし、あなたの関数がもう少しきれいに読みたいと想像してみてください。

“sayHello(to: "Miles", and: "Riley")

引数のラベルは、関数を非常に明確に読みます:「ルークとデイブに挨拶する」。ただし、この関数の実装を確認してください。

func sayHello(to: String, and: String) {
  print("Hello \(to) and \(and)")
}

おそらく、関数の本体内で、非常に悪い名前であることがわかります。関数内の定数の名前を引数ラベルと区別したい場合は、ローカル名の前に外部名を指定できます。

func sayHello(to person: String, and anotherPerson: String) {
  print("Hello \(person) and \(anotherPerson)")
}
 
sayHello(to: "Miles", and: "Riley")

 引数ラベルなしで関数がより明確であれば、先に進んで省略することができます。例えば、印刷機能を取ります。

print("Hello, world!")

関数の名前はすでに、パラメータとして何を渡すべきかを非常に明確にしています。次の方法で関数を呼び出す必要がある場合、それは無関係に感じるでしょう。

p130

print(message: "Hello, world!")

引数ラベルを省略するには、外部名の代わりに _ を使用します。

func sayHello(_ person: String, _ anotherPerson: String) {
  print("Hello \(person) and \(anotherPerson)")
}
 
sayHello("Luke", "Dave")

パラメータを使用すると、関数は柔軟性を維持できますが、ほとんどの場合、使用したい値があります。例えば、ほぼすべての食事と一緒に水を飲むかもしれませんが、時々代わりにオレンジジュースを一杯飲みます。

デフォルトのパラメータ値
関数定義の一部として、任意のパラメータのデフォルト値を指定できます。このようにして、パラメータの有無にかかわらず関数を呼び出すことができます。パラメータが指定されていない場合、関数は単にデフォルト値を使用します。リストの最後にデフォルト値を持つすべてのパラメータを配置する必要があり、これらのパラメータはすべて引数ラベルを持つ必要があります。


func display(teamName: String, score: Int = 0) {
  print("\(teamName): \(score)")
}
 
display(teamName: "Wombats", score: 100) //"Wombats: 100"

display(teamName: "Wombats") 
//"Wombats: 0"

戻り値
乗算の結果の前に常に「結果がある」と印刷したいと思う可能性は低い。代わりに、関数が単に新しい関数を返した場合、より理にかなっているかもしれません。

p.131 
価値。これを行うには、戻り値を持つように関数宣言を調整し、値の型を指定する必要があります。2つのInt型を掛けると常にIntになるので、それが使用する戻り値の型であることを学びました。

func multiply(firstNumber: Int, secondNumber: Int) -> Int

関数の本文内で、returnキーワードを使用して、return関数が何を返すかを指定します。この例では、結果を返す必要があります。

func multiply(firstNumber: Int, secondNumber: Int) -> Int {
  let result = firstNumber * secondNumber
  return result

値を乗算し、結果に新しい値を保存し、すぐに返すのではなく、関数は定数なしで書き込むこともできます。

“func multiply(firstNumber: Int, secondNumber: Int) -> Int {
  return firstNumber * secondNumber 


この関数を呼び出して戻り値を使用するには、戻り値を定数に代入できます。

let myResult = multiply(firstNumber: 10, secondNumber: 5)
 //myResult = 50 

print("10 * 5 is \(myResult)") 

今後二度とmyResultを使用する必要がない場合は、print文内の関数を使用して、定数に値を割り当てるのをスキップできます。


print("10 * 5 is \(multiply(firstNumber: 10, secondNumber: 
5))")
  




この記事が気に入ったらサポートをしてみませんか?