1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【超初心者向け】関数とは

Last updated at Posted at 2023-03-04

最初に

この記事はswiftを勉強し始めた超初心者による超初心者のためのものになっているので、細かいミスなどが散見されるかもしれませんがご了承ください。

関数とは(読みにくいんで飛ばして)

そもそも関数って何だっけってなる人もいると思うのでそこから説明します。自分としては、関数はどんな処理を行うかってことが詰まってるコードの塊だと思ってます。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
    }

上のコードはTableView上のセルの内容を決めるcellForRowAtっていう、よく見る関数です。この関数は、関数内に記述したコードに従って処理がなされていき、最終的にセルの内容が決まるっていう形で読み込まれます。
こんな感じで、関数を読み込むとその関数内のコードが読み込まれ、それに従って処理がなされます。なので、関数の使い方とか、コードの書き方とかを理解すれば自分の思った通りの処理が書けるようになります。

関数の構造

func 関数名(引数名:引数の型) -> 戻り値の型{
}

関数は基本的にこのような構造になっています。ただ、引数や戻り値は無くても使用することができるので、以下のような形の関数が良く使われるかなと思います。

func 関数名(){
}

引数・戻り値

引数(ひきすう)

引数とは、関数内で使用する変数のことを指します。関数名の横の丸括弧内に、引数名: 引数の型 という形で示されます。文で書いてもわかりにくいと思うのでコードで示してみます。

var x: Int = 1

func plus(){
   let sum = x + 1
}

このコードでは引数は使用されていません。関数の外で宣言された変数x変数yが使用されています。

var x: Int = 1

func plus(number: Int){
   let sum = number + 1
}

では、このような関数があった時、xという変数を利用してplus関数を使用したいときはどのように記述するといいでしょうか。

plus(number: x)

このように記述すると、丸括弧内の変数xplus関数の引数であるnumberとして利用されるようになります。

戻り値

戻り値(返り値とも)は、関数内における処理が最終的に出力する値の事です。引数を示す丸括弧の右側に -> 戻り値の型 という形で示され、関数内では return 戻り値 として示されます。上記のコードをもとに見ていきましょう。

var x: Int = 1

func plus(number: Int) -> Int{
   let sum = number + 1
   return sum
}

override func viewDidLoad() {
   super.viewDidLoad()

   plus(number: x)
}

このようなコードの場合、戻り値として返されるのは関数内のsumであり、その値は2となります。

var y: Int = 2

func plus(number: Int) -> Int{
   let sum = number + 1
   return sum
}

override func viewDidLoad() {
   super.viewDidLoad()

   plus(number: y)
}

この場合は、戻り値は3になります。
戻り値の扱いについては、次の呼び出し方についてを参照してください。

呼び出し方

関数の呼び出し方は3つあります(多分)。

@IBAction とか @objc とかで呼び出す
@IBAction func next(){
   self.performSegue(identifier: "toNext", sender: nil)
}

@objc func back(){
   self.dismiss(animated: true, completion: nil)
}

buttonGestureRecognizerなどと関連付けなどして結びつけて呼び出す方法です。

②処理の中で呼び出す(戻り値無し)
override func viewDidLoad() {
   super.viewDidLoad()

   loadTimeLine()
}

func loadTimeLine(){
   let query = NCMBQuery(className: "Post")
   query?.findObjectsInBackground({ (result, error)  in
      if error != nil{
         print("error")
      }else{
         print(result)
      }
   })
}

関数の中で関数を呼び出す方法です。呼び出したいタイミングで 関数名(引数名: 引数に使用する変数名) で記述すると、そのコードが読み込まれたタイミングでその関数が読み込まれます。上記のコードの場合は、ViewDidLoad が読み込まれたタイミングで loadTimeLine関数 が読み込まれます。

③処理として呼び出す場合(戻り値あり)
@IBOutlet var numberLabel: UILabel!

let x: Int = 1
let y: Int = 2

override func viewDidLoad() {
   super.viewDidLoad()

   let sumX = plus(number: x)
   let sumY = plus(number: y)
   let sumXY = makeSum(numX: sumX, numY: sumY)
   numberLabel.text = String(sumXY)   
}

func plus(number: Int) -> Int{
   let sum = number + 1
   return sum
}

func makeSum(numX: Int, numY: Int) -> Int{
   let sum = numX + numY
   return sum
}

上記のコードの場合、どのような順番でコードが読み込まれていくでしょうか。
まず、ViewDidLoad の中で let sumX = plus(X) というコードから、plus関数 が引数を x として読み込まれます。plus関数 の中では、引数であるnumber は x の値である1になり、その結果戻り値として sum つまり2が返ります。この戻り値はどこに行くかというと、この関数が読み込まれたきっかけである let sumX = plus(X)sumX に代入されます。
次に、それと同様に y を引数として plus関数 が読み込まれ、戻り値として sumY に3が代入されます。
次に、makeSum関数sumXsumY を引数として読み込まれ、戻り値として5が sumXY に代入されます。最後に、numberLabel の文字に sumXY つまり5が表示されます。

sender

最後に、sender について軽く説明します。
senderとは、その関数が呼び出された原因となるもののことをさします。(正確には違う気がするけど)

func 関数名(_ sender: sendarの型名){
}

という書き方をします。

@IBAction func changeColor(_sender: UIButton){
   sender.backgroundColor = .red
}

上記の場合、changeColor関数 を何らかのbuttonと関連付けしていた場合、senderはそのbuttonになります。なので、changeColor関数 を呼び出す際に押したbuttonの背景色が赤になります。

sendarのよくある使い方としては以下のようなものがあります。

@IBOtulet var firstButton: UIButton!
@IBOutlet var secondButton: UIButton!
@IBOutlet var thirdButton: UIButton!


override func viewDidLoad() {
   super.viewDidLoad()

   firstButton.addTarget(target: self, ation: #selector(printTag(_:)), for: .touchUpInside)
   firstButton.tag = 1
   secondButton.addTarget(target: self, ation: #selector(printTag(_:)), for: .touchUpInside)
   secondButton.tag = 2
   thirdButton.addTarget(target: self, ation: #selector(printTag(_:)), for: .touchUpInside)
   thirdButton.tag = 3
}

@objc func printTag(_ sender: UIButton){
   let number = sender.tag
   print(number)
}

複数のbuttonに同じ関数を結びつけたとき、押されたbuttonのtagによってどのbuttonが押されたのかということを判別することができます。これは、TableViewの中のどのcellのbuttonが押されたのかっていうことを判別するのにも使用することができます。

最後に

いろいろ細かいミスとかあると思うので、気づいたことあったらご指摘お願いします。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?