最初に
この記事は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)
このように記述すると、丸括弧内の変数x
がplus関数
の引数である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)
}
button
やGestureRecognizer
などと関連付けなどして結びつけて呼び出す方法です。
②処理の中で呼び出す(戻り値無し)
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関数
が sumX
と sumY
を引数として読み込まれ、戻り値として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が押されたのかっていうことを判別するのにも使用することができます。
最後に
いろいろ細かいミスとかあると思うので、気づいたことあったらご指摘お願いします。