*

Swift入門(Xcode6のXCTestフレームワークで学ぶ) 第二回「関数(メソッド)とクロージャーの利用方法」

公開日: : 最終更新日:2014/11/27 Swift , ,


スポンサードリンク



前回はSwiftの概要をザックリと説明させていただきました。

今回は「メソッドの宣言方法」をより詳細に説明させていただきます。
基本的的には、wift入門(Xcode6のXCTestフレームワークで学ぶ) 第一回「Swiftの概要」を読んでいただいていることを前提とした内容となりますので、まずは第一回をご覧下さい。すぐに読み終わる内容です。

本エントリーの内容は以下の通りです。

  1. 関数(メソッド)の宣言と利用方法/li>
  2. クロージャーの宣言と利用方法

 

1 関数(メソッド)の宣言と利用方法

関数(メソッド)の宣言方法

関数(メソッド)の宣言方法と呼び出し方法の基本

関数の宣言は以下のようにして行います。

関数の戻り値がない(Void)の場合は以下のような書式でもOKです。と言うか、こちらの方が一般的です。

関数の呼び出し時の注意点としては、第二引数以降はラベル名を必須で指定しなければならないことです。これはObjective-Cと同じですね。
エラーメッセージは「Missing argument label ‘対象引数のラベル:’ in call」となります。

基本的な利用方法のサンプルは以下の通りです。

引数のデフォルト値の指定

関数定義時の引数の型の後に”=” + “デフォルト値”を指定するだけでOKです。
引数が指定ないで呼び出された時にデフォルト値が適用されます。
納得いかないのですが、デフォルト値を指定すると第一引数でもラベルを指定して呼び出さないとコンパイルエラーとなりますので注意が必要です。

可変長引数

NSLog関数のように、関数の引数の数を可変にすることが可能です。

・パターン1
一番最後の引数の型宣言の後に…をつけることで、可変長引数を持った関数を宣言することができます。

・パターン2
引数が1つしかない場合でも可変長引数を利用することが可能です。

関数内での可変長引数は配列として取り扱います。
実際にはArrayとして扱います。Tには可変長引数の型が適用されます。

・パターン3
また、可変長引数は、関数定義時にArrayを最後の引数とすることでも実現可能です。

上記の例だと。処理の意味するところはパターン1と全く同じですが、関数の呼び出し方は異なります。

基本的な利用方法のサンプルは以下の通りです。

外部引数名宣言

Swiftでは、関数定義時に呼び出し時に指定するラベルと、関数内でその引数を識別するラベルを両方指定することが可能です。
このように両方を指定した時の関数呼び出し時に指定するラベルを外部引数名と呼びます。

外部引数名宣言を用いた関数の宣言は以下のようにして行います。

外部引数名には、関数を利用する利用者が引数の利用用途を明確に意識できるために利用すべきです。
関数宣言時に外部引数名を宣言した場合は、関数呼び出し時には、必ず外部引数名を引数のラベルとして指定する必要があります。
引数名(内部引数名)を指定するとコンパイルエラーとなります。

外部引数名宣言を利用する関数のサンプルは以下の通りです。

外部引数名宣言をしているのに、普通の関数の呼び出し方(下記コード)をすると
Incorrect argument labels in call (have ‘_:stringValue:’, expected ‘outsideNameInt:outsideNameString:’)とコンパイルエラーが発生します。

外部引数名宣言には略記法が存在します。外部引数名と内部引数名を同じラベルにする場合には#引数名: 引数の型との記載だけでOKです。
funcOutsideArgumentNameを略記法を用いて書き直すと以下のようになります。

しかし、このままではコンパイル警告が発生します。警告の内容は以下の通りです。
Extraneous ‘#’ in parameter: ‘outsideNameString’ is already the keyword argument name

第二引数の#は確かに意味がないです。#がなくてもfuncOutsideArgumentNameを呼び出す時のラベル(outsideNameString)は必須ですし、冗長ですよね
第一引数は外部引数名宣言が存在しない場合はラベルの指定が不必要なので#の意味があります。

とここまで書いて腑に落ちない点が・・・、outsideNameStringの前の#を取り除くと今度はコンパイルエラーとなります。
エラーメッセージは
Invalid redeclaration of ‘funcOutsideArgumentName(outsideNameInt:outsideNameString:)’です。
外部引数名宣言を利用するのであれば全ての引数で外部引数名宣言を行わないといけないようです。じゃあ前述の警告っていったい!?

複数の値を返却する関数

タプル(tuple)を関数の戻り値に利用することで実現します。

タプルの一番分かりやすい例としては、タプルを定義するときにラベルもいっしょに指定する方法です。

このように定義するとタプル名.ラベルでタプルの各値を参照できます。

タプル(tuple)の詳細な説明は以下をご覧ください。
「iOS Developer Library」の「The Swift Programming Language」における「tuple-type­の説明」

タプルを返却する関数のサンプルは以下の通りです。

引数の参照渡し(In-Out引数)

一般的なプログラミング言語では値型を関数に引数として渡し、関数内でその引数の値を変更して呼び出し元の値は変わりません。

なお、サンプルコード上でも記載いたしましたが、関数内で引数を変更するためには、引数の宣言の前に”var”を記載する必要があります。

高階関数

「高階関数」とは、関数を引数に取ったり,関数を結果として返すような関数です。

関数を返却する高階関数の例と説明は以下の通りです。
スクリーンショット 2014-11-27 14.10.42

関数を返却する高階関数のサンプル以下の通りです。

次に、関数を引数に取る「高階関数」のサンプルです。
funcCalcAgeの引数をmonth: IntとcalcLogic: Int -> Intに変更して、戻り値をIntに変更します。
実際の変更後のコードは以下のようになりました。

人間か動物かの判定処理が無くなってしまって、計算ロジックを固定で渡すようになりました。
これが嫌な場合は引数に関数を追加して以下のように変更すればOKです。
(isDog: Boolも復活しないといけないですね・・・)

static(静的)関数(メソッド)の宣言方法

2 クロージャーの宣言と利用方法

クロージャーの宣言方法

クロージャーの最も一般的な宣言方法

クロージャーの最も一般的な宣言方法は以下の通りです。

クロージャーのちょっと変わった宣言方法

クロージャーの処理が1行しか存在しない場合は、値を返却するクロージャーでも明示的にリターン文を書化なくてもOKです。

例えば以下のようなクロージャーの宣言があったとします。

このクロージャーは以下のように記載しても同じ意味となります。
1行しか処理が存在しないのでその結果をリターンすると解釈してくれます。

またクロージャーの戻り値の指定を行わなくても同じ意味を持ったコードとなります。
1行しか処理がなく、戻り値の型が類推できるため、コンパイラが良きに計らってくれます。

クロージャーの利用例

クロージャーの呼び出し方法には2つ存在します。
1つ目は直接クロージャーを埋め込む方法で、2つ目は一旦変数や定数に宣言したクロージャーを格納し、その変数や定数を指定する方法です。

「高階関数」で記載させていただいたfuncCalcAge関数(引数がIntと関数オブジェクト)を利用して説明させていただきます。

・直接クロージャーを埋め込む方法
直接クロージャーを埋め込む方法の利用例は以下の通りです。

・定数として宣言したクロージャーを指定する方法
定数として宣言したクロージャーを指定する方法の利用例は以下の通りです。

前述の利用例は関数の引数にクロージャーを指定していますが、クロージャーを直接呼び出すことも可能です。

クロージャーの後置記法

関数の引数となる最後の関数オブジェクトの場合は、後置記法が利用可能です。
(関数の引数に複数の関数オブジェクトが存在しており、その一番最後の関数オブジェクトの場合)


スポンサードリンク

Googleアドセンス

Googleアドセンス




関連記事

Xcode6(xcode_6_beta_7、Xcode 6 GM seed)のインストール方法

2014年9月22日追記 Xcode6の正式版がリリースされApp Storeからインストール可能

記事を読む

iOS(Xcode6とSwift)におけるマルチスレッド処理の実装方法その1[NSThreadクラスの簡単な利用例]

前回はObjective-CにおけるNSThreadクラスの簡単な利用例を取り扱いましたが今回は、ほ

記事を読む

Xcode6とSwiftでイメージ(画像)やアニメーションを表示する方法

本エントリーでは、Xcode6(言語はSwift)を利用してイメージ(画像)やアニメーションを表示す

記事を読む

動画で英語を学習できるiOSの無料アプリCapTubeをリリースいたしました。

個人では初となるiOSアプリをリリースいたしました。 何度もリジェクトをくらいながら、開発開始

記事を読む

iOS(Xcode6とSwift)におけるマルチスレッド(非同期)処理の実装方法その2[GCD(Grand Central Dispatch)の利用]

「iOS(Xcode6とSwift)におけるマルチスレッド処理の実装方法その1」ではNSThread

記事を読む

Xcode6_Beta5&SwiftでUITableViewでUINibを使ったカスタムセル(UITableViewCell)を利用する方法

前回は、「Xcode5&Objective-CでUITableViewでUINibを使ったカ

記事を読む

Swift入門[公式リファレンスのチュートリアルのSteps2の後半]

「Swift入門」では、Steps2の前半まで説明させていただきました。 本エントリーでは、

記事を読む

iOS8開発者向けお勧め本紹介[詳細! Swift iPhoneアプリ開発 入門ノート Swift 1.1+Xcode 6.1+iOS 8.1対応]

iOS7開発者向けお勧め本紹介を以前に紹介させていただきまいたが、今回は同じ著者(大重美幸様)の本を

記事を読む

Xcode6-Beta3でSwiftでBDDを行うためにQuickを導入しようと思ったが、all-product-headers.yaml:4:13: error: Could not find closing ]!が発生する

そろそろQuickを利用しようと思いまたまたハマりました。というかハマり中です。 「Quick

記事を読む

Swift入門(Xcode6のXCTestフレームワークで学ぶ) 第一回「Swiftの概要」 

Swiftの簡単な説明 アップルのiOS(iOS8以降)およびOS Xのためのプログラミング言語。

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

動画で英語を学習できるiOSの無料アプリCapTubeをリリースいたしました。

個人では初となるiOSアプリをリリースいたしました。 何度もリジ

no image
Ruby on rails4系でBootstrapを利用するためのtips

MacでRuby on rails4系のBootstrapを利用しよう

no image
Java、Eclipse、JUnit関連のエントリーの移行のお知らせ

Java、Eclipse、JUnit関連のエントリーは http:/

iOS8開発者向けお勧め本紹介[詳細! Swift iPhoneアプリ開発 入門ノート Swift 1.1+Xcode 6.1+iOS 8.1対応]

iOS7開発者向けお勧め本紹介を以前に紹介させていただきまいたが、今回

Swift入門(Xcode6のXCTestフレームワークで学ぶ) 第二回「関数(メソッド)とクロージャーの利用方法」

前回はSwiftの概要をザックリと説明させていただきました。 今

→もっと見る

Optimization WordPress Plugins & Solutions by W3 EDGE
PAGE TOP ↑