2015年11月17日火曜日

【Xcode / Swift入門】簡単なToDoリストアプリを作ってみよう

本稿では、Swift2.0を用いてToDoリストを作ってみたいと思います。 
※以前に記載したTableView、Segue、データの保存方法を使用するため、もし前記事をご覧になられていない方は、下記をご参照ください。
 3-1. TableViewを使ってみよう
 3-2. Segueを使ってみよう
 3-3. データを保存してみよう

今回のToDoListの目標は、下図のようにToDoアイテムの追加、リスト表示、削除、更新ができることを目指します。また、アプリを落としてもデータが保存されている(データが消えない)ように設定もします。






アプリの見た目(Main.storyboard)の設定

では、アプリの見た目を作成するために、Main.storyboardを設定していきます。
まず始めに、プロジェクトを作成します。Xcodeを開いて、
Create a new Xcode project → Single View Application → product name を”ToDoList”としてCreateボタン
を押します。プロジェクトが作成されましたら、Main.storyboadを開きます。
まずは、ToDoアイテムを表示するリスト画面を作成するために、View ControllerにTableView及びNavigationBarを配置します。

ユーティリティエリアよりTableViewを選択し、View Controllerにドラッグ&ドロップします。合わせて、セルを一つ追加(Prototype Cellsを"1"に)しておきます。


次に、追加したセルを選択し、Identifierを"cell"とします。


最後に、TableViewをControlを押しながら、View Controllerへドラッグ&ドロップし、"dataSource"と"delegate"をチェックしましょう。これでTableViewの使用が可能になります。
※この辺りの詳細は、「3-1. TableViewを使ってみよう」にて解説しています。



次に、NavigationBarの設定です。ユーティリティエリアよりNavigationBarをViewControllerへドラッグ&ドロップし、追加したNavigationBarにBarButtonItemをドラッグ&ドロップします。合わせてBarButtonItemのSystem Itemを"Add"に変更し、追加を表す”+”マークに変更しておきましょう。


以上で、ToDoリストを表示する画面の設定は完了です。

次に、アイテムを追加する画面を設定していきます。ユーティリティエリアよりViewControllerをドラッグ&ドロップし、ViewController(画面)を追加します。合わせて、画面サイズも変更しておきましょう。



では、追加したViewControllerに下図のようにNavigationBar、BarButtonItem(戻る)、TextField、Buttonを作成しましょう。



以上で、アイテムを追加する画面の作成は完了です。

では、見た目(Main.storyboard)の設定の最後にSegueを設定します。ToDoList画面の"+"を押下するとアイテム追加画面へ、アイテム追加画面の戻るを押下するとToDoList画面へ遷移するよう設定します。

"+"ボタンをControlを押しながらアイテム追加画面へドラッグ&ドロップし、Showを選択します。


同様に、"戻る"ボタンをControlを押しながらToDoList画面へドラッグ&ドロップし、Showを選択します。下図のように表示されていれば成功です。



ここで、一旦ビルドして画面がちゃんと表示されていること、画面遷移できることを確認します。そこまで出来れば、画面の設定は完了です。次はソースコードを記述(実装)していきます。


ToDoアイテム追加画面の実装

まず初めに、ToDoListへアイテムを追加する画面の実装を行います。
この画面では、
・テキストフィールドに入力された文字列をAddボタンが押下されたら保存する
・保存するにあたっては、NSUserDefaultsを使用
・キーボード以外をタッチするとキーボードが下がる
・キーボードのreturnを押下すると、キーボードが下がる
という機能を実装します。

まずは、ソースコードを記述するSwiftファイルを作成します。
File→New→File...を選択し、CocoaTouchClassを選択します。


Nextボタンを押し、
Class:AddToDo
Subclass of:UiIViewController
Language:Swift
を選択し、Nextボタンを押します。

そうするとAddToDo.swiftというファイルができると思います。

次に、これをMain.storyboardで作成したViewから使用できる設定をします。
Main.stoyboadを開いて、アイテムを追加する画面の左上のボタンを選択肢、Custom ClassにAddToDoと記述します。こうすることにより、このViewとAddToDo.swiftが関連付けられたことになります。




次に、テキストフィールドに入力された文字列をAddボタンが押下されたら保存する機能を実装します。

出来上がったAddToDo.swiftにMain.storyboadから変数を追加します。
テキストフィールドをcontrolを押しながらソースコードの画面にドラッグ&ドロップし、Connectionがoutletになっていることを確認し、適当に名前をつけます(例では、itemTextとしています)。次に、Addボタンも同様にcontrolを押しながらソースコードの画面にドラッグ&ドロップし、ConnectionをActionに変更し適用に名前をつけます(例では、addItemとしています)。







変数の準備ができたら、import UIKit直下に

var todoItem = [String]()

と記述します。これは、ToDoアイテムを一旦保存するためのString型の配列で、クラス(ファイル)を跨って使用するため、 classの前(import UIKit直下)に記載します。

次に、ボタンをクリックされた際にNSUserDefaultsにテキストフィールドの値を保存するよう記述します。テキストフィールドの値をString型の配列todoItemに格納し、NSUserDefaultsにSetします。合わせて、テキストフィールド内の文字列は、空欄にします。

    
@IBAction func addItem(sender: AnyObject) {
        todoItem.append(itemText.text!)
        itemText.text = ""
        NSUserDefaults.standardUserDefaults().setObject(todoItem, forKey: "todoList")
}


次に、キーボード以外をタッチするとキーボードが下がる機能です。class AddToDo: UIViewController 内に以下を記述します。これは、決まり文句みたいなものです。

 
 override func touchesBegan(touches: Set, withEvent event: UIEvent?) {
        self.view.endEditing(true)
    }
 

最後に、キーボードのreturnを押下すると、キーボードが下がる機能です。class AddToDo: UIViewController 内に以下を記述します。こちらも決まり文句みたいなものです。
 
    func textFieldShouldReturn(textField: UITextField!) -> Bool {        
        itemText.resignFirstResponder()        
        return true        
    }

これで、アイテムを追加する画面の実装は完了です。次にToDoList画面を実装していきます。


ToDoList画面の実装

次に、追加したToDoアイテムのリストを表示する画面を実装していきます。
この画面では、
・NSUserDefaultsに保存されているアイテムの取得、表示
・NSUserDefaultsに保存されているアイテムをスライドして削除
・テーブル(リスト)を下に引っ張って更新
する機能を実装したいと思います。


NSUserDefaultsに保存されているアイテムの取得、表示機能を実装します。
この実装は、3-1. TableViewを使ってみように記載した通りの実装をします。詳細は、3-1をご参照ください。

まず初めにTableViewを取得するために、class名の後ろにUITableViewDelegateを追加します。

class ViewController: UIViewController,UITableViewDelegate {

次に、NSUserDefaultsの値を取得し、先ほどのAddToDo.swiftにて作成した配列型の変数todoItemに代入します。これは起動時に呼ばれる関数であるviewDidLoad()内に記述します。

   
override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        if NSUserDefaults.standardUserDefaults().objectForKey("todoList") != nil {
            todoItem = NSUserDefaults.standardUserDefaults().objectForKey("todoList") as! [String]         
        }
    }


次に、以下二つの関数を記述します。

一つ目は、Tableに表示する行数を指定する関数です。これは、先ほど記述したNSUserDefaultsの値が代入されている変数todoItemが保持している文字列の数をカウントします。

 
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return todoItem.count 
    }

2つ目は各行へ値を表示する関数です。NSUserDefaultsの値が代入されている変数todoItemが保持している文字列を各テーブルに表示していきます。

    
 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cellValue = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cell")
        cellValue .textLabel?.text = todoItem[indexPath.row]
        return cellValue
    }

次に、NSUserDefaultsに保存されているアイテムをスライドして削除機能を記述します。まず初めに、TableViewを操作するためにMain.storyboadから変数を持ってきます。
TableViewをcontrolを押しながらソースコードの画面にドラッグ&ドロップし、Connectionがoutletになっていることを確認し、適当に名前をつけます(例では、todolistTableとしています)



次に、下記の関数を記述します。これはTableViewのcellをEdit(編集)したい場合に使用する関数です。今回は削除(delete)をするため、削除する場合は、関数内で UITableViewCellEditingStyle.Deleteを使用します。
また、配列から該当の値を削除するため、removeAtIndex()関数も利用します。削除後は、再度NSUserDefaultsに値をセットし、最後にTableView全体を更新します。TableViewの更新には、先ほど作成したTableViewの変数にreloadData()と記述します。

 
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath){
        if editingStyle == UITableViewCellEditingStyle.Delete{
            todoItem.removeAtIndex(indexPath.row)
            NSUserDefaults.standardUserDefaults().setObject(todoItem, forKey: "todoList") 
            todolistTable.reloadData()     
        }
    }


最後に、テーブル(リスト)を下に引っ張って更新機能を記述します。
これは決まり文句のようなもので、下記を記述します。
 
override func viewDidAppear(animated: Bool) {
        todolistTable.reloadData()
    }


ここまでできたらビルドして、アイテムの追加削除をしてみてください。以上で完成です。今回は初歩的なところまでの作成にしていますので、色々拡張してみてください。

では、以下にViewController.swiftとAddToDo.swiftの全コードを記述しておきます。

 
//
//  ViewController.swift
//  ToDoList
//
//  Created by mosho on 2015/11/01.
//  Copyright © 2015年 mosho. All rights reserved.
//

import UIKit

class ViewController: UIViewController,UITableViewDelegate {
    
    @IBOutlet weak var todolistTable: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        if NSUserDefaults.standardUserDefaults().objectForKey("todoList") != nil {
            todoItem = NSUserDefaults.standardUserDefaults().objectForKey("todoList") as! [String]
        }
    }
    
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return todoItem.count
    }
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cellValue = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cell")
        cellValue .textLabel?.text = todoItem[indexPath.row]
        return cellValue
    }
    
    
    func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath){
        if editingStyle == UITableViewCellEditingStyle.Delete{
            todoItem.removeAtIndex(indexPath.row)
            NSUserDefaults.standardUserDefaults().setObject(todoItem, forKey: "todoList")
            todolistTable.reloadData()
        }
    }
    
    override func viewDidAppear(animated: Bool) {
        todolistTable.reloadData()
    }
    

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}


    
//
//  AddToDo.swift
//  ToDoList
//
//  Created by mosho on 2015/11/01.
//  Copyright © 2015年 mosho. All rights reserved.
//

import UIKit

var todoItem = [String]()

class AddToDo: UIViewController {
    
    @IBOutlet weak var itemText: UITextField!
    
    @IBAction func addItem(sender: AnyObject) {
        todoItem.append(itemText.text!)
        itemText.text = ""
        NSUserDefaults.standardUserDefaults().setObject(todoItem, forKey: "todoList")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    override func touchesBegan(touches: Set, withEvent event: UIEvent?) {
        self.view.endEditing(true)
    }
    
    func textFieldShouldReturn(textField: UITextField!) -> Bool {
        itemText.resignFirstResponder()
        return true
    }
}




また、今回作成したViewController.swiftAddToDo.swiftは各リンクから取得可能です。ご参考までに。

では、次回はMapKitの使い方について説明したいと思います。



2015年10月27日火曜日

【Xcode / Swift入門】データを保存してみよう

本稿では、Swiftを使ってデータを保持する方法について説明したいと思います。
データの保存方法としては、データベースやファイルなどに保存する方法がありますが、今回は、端末のストレージに半永久的に保存可能なNSUserDefaultsについて説明したいと思います。

NSUserDefaultsの使用方法はとっても簡単です。
1、データの保存(セット)
2、データの取り出し
この2つを設定するだけです。


データの保存(セット)

データの保存方法は、override func viewDidLoad(){ }の中に以下を記載します。

 NSUserDefaults.standardUserDefaults().setObject("保存したい文字列", forKey: "キー")

setObject関数が値を保存する関数で、1番目の引数に保存するデータを記述し、2番目の引数にデータを取り出す際に使用するキーを記述します。

上記の例の場合、「保存したい文字列」という値がキーというKeyと関連付けられて保存されます。

データの取り出し

データを取り出す場合は、override func viewDidLoad(){ }の中に以下を記載ます。

NSUserDefaults.standardUserDefaults().objectForKey("allGreeting")

ObjectForKey関数がデータを取り出す関数で、引数として、データを保存する際に指定したキーを記述することにより、キーと一致するデータを取り出すことが可能になります。

使い方(サンプル)


では、実際にプロジェクトを作成し、データを保存してみたいと思います。
Xcodeを開いて、
Create a new Xcode project → Single View Application → product name を”Save Data”としてCreateボタン
を押します。

プロジェクトが作成されたら、ViewController.swiftを選択し、override func viewDidLoad(){ }内に以下を追記します。
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        NSUserDefaults.standardUserDefaults().setObject("hello", forKey: "GREETING")
        
        let greeting = NSUserDefaults.standardUserDefaults().objectForKey("GREETING") as! String
        
        print(greeting)
    }

上記は、GREETINGというキーで文字列「hello」を保存し、それをString型として取り出し、greetingという変数に代入していることになります。ここで、一旦ビルドしてみます。すると、下図の通り、setObjectを削除してもHelloが消えない(保存されたまま)になっていることが確認できます。




同様に配列もデータの保存が可能です。下記のように記載し、ビルド後、SetObjectをコメントアウトしてもデバッグエリアから文字列が消えないことが確認できます。
先ほどは、String型として(as String)データを取り出していましたが、今回は、配列ですので、Array型として(as NSArray)データを取り出します。
    
        override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        let array = ["good morning", "hello", "good evening", "good night "]
        
        NSUserDefaults.standardUserDefaults().setObject(array, forKey: "GREETINGS")
        
        let greetings = NSUserDefaults.standardUserDefaults().objectForKey("GREETINGS") as! NSArray
        
        print(greetings[3])
        
        
    }




このように、NSUserDefaultsを使用することにより、簡単にデータの保存、取り出しができるようになります。

では、次回はTableView、Segue、データ保存を使って、ToDoリストを作ってみたいと思います。



2015年10月19日月曜日

【Xcode / Swift入門】Segueを使ってみよう

本稿では、Xcodeの機能であるSegue(セグエ)について、記載いたします。


Segueとは

Segueとは、Xcodeのstoryboard上で作成した画面をコードを記述せずに別の画面に遷移させる機能のことです。
 例えば、
画面1→画面2
画面2→画面1
といった操作が可能になる機能(”→”に該当する機能)がSegueになります。
つまり、iPhoneアプリ開発に必要な画面遷移の方法についての説明となります。


Segueを体験してみよう

では、実際にプロジェクトを作ってSegueの動作を見ていきたいと思います。Xcodeを開いて、 
Create a new Xcode project → Single View Application → product name を”Segue”としてCreateボタン
を押します。
※プロジェクトの作成方法がわからない場合は、こちらをご参照ください。


プロジェクトが作成されましたら、Main.storyboardを選択し、シミュレータのバージョン、画面サイズを変更します(今回は、シミュレータをiPhone5S、画面サイズを4inchとします。)。


次に、ユーティリティエリアより、View Controllerをドラッグ&ドロップで真ん中のエリアに持ってきます。すると、 View Controllerが作成されます。つまり、画面を新しく作成したことになります。二つ目の画面もサイズを変更し、並列して並べておきましょう。



では、最初に作られていたView Controller(左画面)から先ほど作ったiew Controller(右画面)に移動するSegueの設定をしたいと思います。
左画面にボタンを適当に配置します(”進む”という名前に変更します)。そして、そのボタンをControlを押しながら右画面にドラッグ&ドロップします。すると、下図のような設定画面が出てきますので、Showを選択します。



すると下図のようにView Controller間を接続したような記号が出てきます。これがでればSegueの設定完了です。



同様に、右画面にボタンを適当に配置し(”戻る”という名前に変更します)、左画面へのSegueの設定を行います。



ここまで出来たら、一旦ビルドしてみましょう。進むボタンや戻るボタンをクリックすると、画面を行き来していることが確認できると思います。



Segueを応用してみよう

このSegue機能はNavigation barと連携して使うとよりアプリに近い感じになります。
例えば、ユーティリティエリアよりNavigation barを下図のようにドラッグ&ドロップでも持ってきます。




次に、Navigation barにBar button Itemをドラッグ&ドロップし、名前を変更します。



あとは、前述と同様に、進む/戻るのようなSegueを設定してあげることにより、画面の行き来が可能になります。



このようにSegueを使用することにより、簡単に画面の行き来が可能になります。

では、次回はSwiftを使ったデータの保存方法について説明したいと思います。




2015年10月14日水曜日

【Xcode / Swift入門】TableViewを使ってみよう

本稿では、TableViewについて、説明します。TableViewとは、掲示板、まとめサイト、ToDoリストやメールの受信ボックスなどでよく使用される下図のようなリストです。



とてもよく使用する機能なので、使えるようになると便利です。今回は、TableViewを作成し、文字列を表示するまでを目標にしたいと思います。

TableViewを作ってみよう

では、実際にTableViewを作ってみたいと思います。Xcodeを開いて、 
Create a new Xcode project → Single View Application → product name を”TableView”としてCreateボタン
を押します。
※プロジェクトの作成方法がわからない場合は、こちらをご参照ください。

プロジェクトが作成されたら、Main.storyboardを選択し、シミュレータのバージョン、画面サイズを変更します(今回は、シミュレータをiPhone5S、画面サイズを4inchとします。)。そして、ユーティリティエリアよりTableViewを選択し、ドラッグ&ドロップで真ん中のエリアの画面内に持っていきます。




さらに、オートレイアウトの設定もしておくと、画面サイズの変更や縦横画面切り替え時に自動で配置してくれます。



次に、Tableの行数の設定をします。先ほど追加したTableViewをクリックし、ユーティリティエリアのPrototypeCellsの値を変更します。この値が行数になっており、値を変更することにより、行の増減が可能になります。



また、行に名前をつけます。これは、ソースコードからTableを扱う際に、どの行を扱って良いかを指定する為につける名前です。ソースコードからは1行目という指定ではなく、1行目に付いている名前を指定する必要があります。設定方法は、行を選択し、Identifier欄に名前を記載するだけです(何でも良いですが、今回は、"cell"という名前をつけます。)。



次に、TableViewを ViewControllerにて使用できるように設定します。TableViewをControlを押しながら選択し、ViewControllerにドラッグ&ドロップします。 



そうすると、outlet欄にDatasourceとdelegateが表示されると思いますので、両方をチェックします。



この設定を行うことにより、TableViewをViewController内で使用できるようになるのはもちろん、ViewController.swiftにて記述したソースコードからも制御可能になります。

TableViewに関連するソースコードを書いてみよう

次に、ViewController.swiftを開きます。ここに実際のコードを記述していきます。 まずは、TableViewを使用するための宣言として、UIViewControllerの後ろに、UITableViewDelegateを追加します。この宣言を記述することにより、 tableViewに関する様々な関数を利用することができます。
※TableViewに関数を使いたい場合は、UITableViewDelegateをコマンドキーを押しながら押しながらクリックします。

    
import UIKit
class ViewController: UIViewController,UITableViewDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

今回使用する関数は、以下の二つになります。

1、Tableに表示する行数を指定する関数
    
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
}

2、各行へ値を表示する関数
    
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
}

では、実際に配列として変数を定義し(例:var cellArray = ["Hello","World","Swift","Xcode"])、その値を各行に表示するソースコードを記述してみます。

まず、行数指定関数です。今回の例では、配列に文字列が”4つ”あるため、return 4を記述します。
    
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

retrun 4


これは、値を表示する行数が4つありますよ、ということを意味しています。

次に、値を表示する関数です。 まずはじめに、下記の関数を用いてどの行に表示するのかを指定します。
let cellValue = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cell")

先ほどMain.storyboardにて指定した行数の名前「cell」をreuseIdentifierとして、定義します。つまり、cellという名前の行を扱う変数を設定したことになります。
次に上記の変数のテキストに配列の値を代入します。

cellValue.textLabel?.text = cellArray[indexPath.row]

配列の[]内にindexPath.rowと記載することにより、配列の1番目がTableの1行目、配列の2番目がTableの2行目といったような値を取得することができます。その値をテキストとして、cellに表示していくというのが上記の変数の意味するところになります。
そして、最後に

return cellValue

を返すことにより行へ値を表示することが可能となります。

※Main.storyboardにて指定する行数と関数にて指定する行数の使い分けとしては、Main.storyboard内の行数は、例えば、各行に名前(Identifier)を与え、それぞれ違った処理をさせたい場合に増やすなどの使い方をし、関数の場合は、実際に値を表示する行数を指定する場合に利用します。

ここまでできたら、ビルドしてシミュレータを起動します。下記のように表示されていたら成功です。



もし、行は表示されているが、中身(値)が何も表示されていないようでしたら、 
・ViewControllerへの括り付け(Datasourceとdelegateのチェック) 
・cellのIdentifier(行の名前)の設定 ができているか再度確認してください。

ViewController.swiftの全体のコードは以下になります。

  
import UIKit

class ViewController: UIViewController,UITableViewDelegate {
    
    var cellArray = ["Hello", "World", "Swift", "Xcode"]

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        return 4
        
    }
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cellValue = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cell")
        
        cellValue .textLabel?.text = cellArray[indexPath.row]
 
        return cellValue
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}



では、次回はSegueについて説明したいと思います。





2015年10月9日金曜日

【Xcode / Swift入門】関数とクラスについて

本稿では、関数と、オブジェクト指向プログラミングでは必須のクラスについて、記載していきます。関数もクラスも特にSwiftならでは、というわけではなく、他の言語でも頻繁に使用される概念になります。


関数

関数とは、簡単にいうと、データを受け取り(受け取るデータを引数と言います。)、決められた(もしくは自分で決めた)処理を実行して結果を返してくれるプログラムのことを言います。

例えば、今までよく使用してきたprint()も、( )内に記載した値を表示してくれる関数です。そして、( )内に記載していた値を引数と呼びます。

swiftでは関数を下記のように定義します。

func 関数名(引数) -> 返り値の型 {
    return 返り値
}

では、上記を使って、時間ごとに挨拶を変える関数を作ってみたいと思います。 
Playgroundを起動し、下記のように記述してみてください。

//時間(引数)の定義
var time = 23

//時間によって挨拶を変える関数
func greetings(time: Int) -> String{
    
    if time < 5 {
        return "もう\(time)時だ。早く寝よう。"
    }else if time < 10 {
        return "\(time)時ですね。おはようございます"
    }else if time < 15 {
        return "\(time)時ですね。こんにちは"
    }else if (time < 17) {
        return "\(time)時ですね。お疲れ様です"
    }else if (time < 24) {
        return "おやすみなさい"
    }else {
        return "エラー:そんな時間はありません"
    }
}

//関数呼び出し
greetings(time)

これは、greetingsという関数の中で、引数として受け取った時間データを元に挨拶のパターンを変えて、その時刻にあった挨拶を返すというものです。Int型の引数で受け取った値をString型で返すことが読み取れると思います。
また、timeの値を変更すると関数の値が変化することがわかると思います。



このように関数を使うことにより、引数で渡されたデータを使って処理を実行することが可能となります。簡単な処理(プログラム)なら特に気にしなくて良いのですが、複雑になったり、コード数が多くなったりすると、プログラム内の色々な場所に頻繁に出てくるような記述が出てきます。そういったものを、関数として再利用できるように別出しするととても便利です。

クラス

クラスとは、オブジェクト指向プログラミングでは、必ずでてくるとても重要な概念です。簡単に言うと、前述した関数と変数をまとめたものです。

まず、単語の定義です。クラスでは、インスタンス、プロパティ、メソッドと呼ばれる単語が頻繁に使用されます。

インスタンス:クラスを使用できるようにした値(変数、定数)
プロパティ:クラス内にて定義した変数
メソッド:クラス内に定義した関数

そして、クラスは下記のように記述します。

class クラス名{

    //プロパティの定義
    var 変数名
 let 定数名

    //メソッドの定義
    func 関数名(引数) -> 返り値の型 {
    return 返り値
 }
}

では、先ほど作成した時間によって挨拶を変更するプログラムをクラスとして記述してみたいと思います。変更箇所は簡単で、変数と関数をclassの中に入れると完成です。

class goodGreetings{

    //時間(引数)の定義
    var time :Int = 0

    //時間によって挨拶を変える関数
    func greetings(time: Int) -> String{
    
        if time < 5 {
            return "もう\(time)時だ。早く寝よう。"
        }else if time < 10 {
            return "\(time)時ですね。おはようございます"
        }else if time < 15 {
            return "\(time)時ですね。こんにちは"
        }else if (time < 17) {
            return "\(time)時ですね。お疲れ様です"
        }else if (time < 24) {
            return "おやすみなさい"
        }else {
            return "エラー:そんな時間はありません"
        }
    }
}

次にクラスの操作です。インスタンスを生成して、定義したクラスを利用できるようにします。インスタンスの生成は、クラス名の後ろに()を付け、定数に代入します。そして、このクラス名()が代入された定数をインスタンスと言います。加えて、クラスの中の変数を使用したい(変数に値を代入したい)場合はインスタンス名.プロパティ、クラスの中の関数を使用したい場合は、インスタンス名.メソッドを使います。

では、実際に先ほどのプログラムにインスタンスの生成および変数への値の代入、関数の利用を実行してみます。

//クラスの利用
let gG = goodGreetings() //インスタンスの生成
gG.time = 4
gG.greetings(gG.time)


実行結果は以下になります。インスタンス名.プロパティに代入した値により、挨拶が変化しているのが確認できると思います。



では次回は、アプリ開発に必要なXcodeの機能について説明したいと思います。