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の機能について説明したいと思います。




2015年10月6日火曜日

【Xcode / Swift入門】配列(Array)とディクショナリーについて

本稿では、配列とディクショナリーについて説明していきます。

配列とは、複数の値を格納できる変数(もしくは定数)のことを言います。Swiftには、値の追加、削除、変更、参照などが可能な関数が既に用意されています。

一方、配列とはちょっと違い、キーと値をセットで保存し、データベースのようにデータ操作が可能な定義/型をディクショナリと言います。数値や文字列をキーにして、値の追加、削除、変更、参照などが可能な型です。

配列の定義

配列の定義には2パターンあります。

1、型を指定する場合
2、型を指定しない場合

配列は”カギ括弧[]”で記述します。
つまり、どちらのパターンも”カギ括弧[]”で囲む必要があります。
例えば、型を指定する1の場合は、変数名の後に型を記述し、型および代入する値の両方をカギ括弧で囲みます。

var 変数名: [Int] = [1,2,3,4,5]

一方、変数の初期値として値を入れておけば、Swiftが勝手に推測してくれるため、型を明示的に指定する必要はありません。そのため、値だけをカギ括弧で囲めば、Swiftはそれを配列として認識します。

var 変数名 = [1,2,3,4,5]
※型を定義する必要なし

実際にplaygroundにて、下記の通り記述してみます。

var str: [String] = ["Hello", "playground"]
var str1 = ["Hello", "playground"]

print(str)
print(str1)

型を宣言せずともswiftが配列の中身を見て、String型と判断してくれていることがわかると思います。


【配列】要素の追加、削除、参照

では、配列を使って要素の追加、削除、参照をしてみたいと思います。実際にPlaygroundを使って、下記を実行してみたいと思います。
・1〜9の数字を持った配列を定義
・10を配列へ追加
・5を表示
・7と10を削除
・2〜4を削除
・結果として、[1,5,6,8,9]と表示させる。

上記を実行するにあたり、配列の操作としてよく使用する関数を説明します。ここでindexという概念を使用します。これは、要素の位置を示す際によく使われる変数で、index=0の場合、先頭の値、index=1の場合は、2番目の値を示します。

・要素の追加
 変数名.append[追加する要素]

・要素の参照
 変数名[Index]

・要素の削除
 変数名.removeAtIndex(index)

末尾の要素を削除
 変数名.removeLast()

・範囲内の要素を削除
 変数名.removeRange(範囲指定)

では、Playgroundを起動し、下記のように記述してみます。
    
//配列の定義
var array = [1,2,3,4,5,6,7,8,9]

//要素の追加
array.append(10)

//要素の参照
array[4]

//要素の削除
array.removeAtIndex(6)

//末尾の要素を削除
array.removeLast()

//範囲内の要素を削除
array.removeRange(1...3)
print(array)

上記を実行すると下記のようになり、要素が追加、削除できていることが確認できると思います。


このようにして、配列への要素の追加、削除、そして参照が可能になります。

ディクショナリーの定義

次にディクショナリの定義について説明します。ディクショナリの定義も配列と同様に型なし、型ありどちらでも記述可能になっています。違いはキーを指定することが可能な点になります。

1、型を指定する場合
var 変数名: Ditionary<キーの型、値の型> = ["キー1": "値1", "キー2": "値2"]
もしくは
var 変数名: [キーの型: 値の型] = ["キー1": "値1", "キー2": "値2"]

2、型を指定しない場合
var 変数名 = ["キー1": "値1", "キー2": "値2"]

こちらも配列と同じく3パターンをplaygroundにて記述したいと思います。
下記のように記述してみます。

var version: Dictionary<String, Double> = ["swift": 1.0, "xcode": 6.0]
var version1: [String: Double] = ["swift": 1.2, "xcode": 6.4]
var version2 = ["swift": 2.0, "xcode": 7.0]

すると、以下のように、キーと値がセットで表示されていることが、わかると思います。



【ディクショナリ】要素の追加、参照、削除

では、ディクショナリを使って要素の追加、参照、削除をしてみたいと思います。
Playgroundに下記のように記述します。

//ディクショナリの定義
var human = ["name": "mosho","age": 5]

//要素の追加
human["country"] = "Japan"
print(human)

//要素の参照(取り出し)
var age = human["age"]
print(age)

//要素の削除
human["age"] = nil
print(human)

要素を追加する場合は、定義した変数名の後ろにカギ括弧を付けキーを指定し、値を代入します。要素を取り出したい場合は、定義した変数の後ろにカギ括弧を付けキーを指定したものを、変数に代入します。削除する場合は、定義した変数の後ろにカギ括弧を付けキーを指定し、nilを代入します。

以下が実行結果になります。"age"のところがオプショナル型になっていますが、ageに!を付与すると消えると思います。



今回は、配列やディクショナリ型の簡単な操作について説明しました。配列やディクショナリはとても重要なので、また別記事にてアプリを作りながら説明したいと思います。

では、次回はクラスと関数について説明したいと思います。




2015年9月26日土曜日

【Xcode / Swift入門】条件分岐とループ制御について

本稿では、Swiftの条件分岐とループ制御、つまりif文、switch文、for文、while文、について説明していきます。


if文

if文はSwiftを含め他のプログラム言語でも非常によく使用される条件分岐の構文です。日本語訳と一緒で、「もし〜だったら◯◯」といった使い方をし、下記のように記述します。

if 条件{ ◯◯ }

上記の場合は、”もし条件が正しければ、◯◯を実行する”という意味になります。

ifとセットになって必要になるのが、elseです。elseも日本語訳通り、「その他の」といった使い方をし、下記のように記述します。

    
if 条件1 {
    もし条件1が正しい場合、ここに記載された構文を実行する
} else if 条件2 {
    もし条件2が正しい場合、ここに記載された構文を実行する
} else {
    上のどの条件にも当てはまらない場合、ここに記載された構文を実行する
}

ここで、注意が必要なのですが、ifの後ろの”条件”には、正しいか正しくないか判断する構文を記載する必要があります。つまり、ifの後ろはtrue or false で返すBool型である必要があります。

また条件には、&&や||の記号を使用することにより、複数の条件をANDやORで連結することも可能です。
    
if 条件1 && 条件2 {
    もし条件1と条件2が正しい場合、ここに記載された構文を実行する
} else if 条件3 || 条件4 {
    もし条件3もしくは条件4が正しい場合、ここに記載された構文を実行する
} else {
    上のどの条件にも当てはまらない場合、ここに記載された構文を実行する
}

それでは、Playgroundにて下記のようなソースコードを記述してみます。

var result2:Int = 0

var time : Int
time = 25
if time < 5 {
    print("もう\(time)時だ。早く寝よう。")  
}else if time < 10 {  
    print("\(time)時ですね。おはようございます")
}else if time < 15 {  
    print("\(time)時ですね。こんにちは")
}else if (time < 17) {   
    print("\(time)時ですね。お疲れ様です")
}else if (time < 24) {
    print("おやすみなさい")
}else {
    print("エラー:そんな時間はありません")
}



結果を見てわかる通り、timeの値により条件分岐されています。







※C言語やJavaなどでは、if の後ろの条件式は、()をつけるする必要がありますが、Swiftでは、()は不要です。もちろんつけても問題ないです。


switch文

switch文は値によってコードを切り替えてくれる、つまりスイッチしてくれる条件分岐の構文になります。 casedefaultという値を使って、下記のように記述します。
    
switch 比較する変数や定数 {
case 値1:
    比較する変数や定数が値1と一致する場合の処理
case 値2:
    比較する変数や定数が値2と一致する場合の処理
case 値3,値4:
    比較する変数や定数が値3もしくは値4と一致する場合の処理
 default:
    どれとも一致しなかった場合の処理
}


また、caseは、範囲指定も可能です。範囲指定する場合は、値と値の間を「...」で結びます。

例えば、1〜10と範囲指定したい場合は、
case 1...10:
と記述します。

それでは、if文のときと全く同じ結果になるようにSwitch文でも記述したいと思います。

var time : Int

time = 17
switch time {
case 0...5:    
    print("もう\(time)時だ。早く寝よう。")    
case 6...10:   
    print("\(time)時ですね。おはようございます")
case 11...15:   
    print("\(time)時ですね。こんにちは")   
case 16...17:   
    print("\(time)時ですね。お疲れ様です")   
case 18...24:   
    print("おやすみなさい")
default:
    print("エラー:そんな時間はありません")
}

下記の結果をみてわかる通り、timeの値によって、表示する文字列が分岐(スイッチ)されていることがわかると思います。




for文

for文は、繰り替え処理を実行することができるループ制御の構文です。記述方法として、下記2種類あります。
    
①
for 変数定義 in スタート値...終了値 {
    繰り返し実行する処理
}

②
for 初期処理(変数定義など);  繰り返し条件(どういう場合に繰り返すのか); 後処理(変数値を増やすなど) {
    繰り返し実行する処理
}

①の場合、forの後に定義した変数にスタート値〜終了値までを代入し、その回数分、処理を繰り返します。
例えば、
for index in 1...10{
処理1
}
と記述した場合は、
indexに”1”を代入し処理1を実行、indexに”2”を代入し処理1を実行・・・indexに"10"を代入し、処理1を実行、終了
という動作をします。

②の場合、初期処理にて定義した変数を用いて、その変数が繰り返すための条件を記載し、
例えば、
for var i = 0; i<10; i++{
処理1
}

と記述した場合、
iが10より小さい場合は、処理1を実行し、処理1が終われば、i++(iを1増加)させる
という処理になります。

では、実際にPlaygrundでどういう動きをするか見てみましょう。
2つのパターンで、1〜10の足し算をしてみたいと思います。

下記のように記載してください。
    
var result1:Int = 0
for index in 1...10{   
    result1 = index + result1
}
print(result1)
var result2:Int = 0
for var i = 0; i <= 10; i++  {    
    result2 = i + result2
}
print(result2)

どちらのコードも、数字を1ずつ増やしそれを足していっていることがわかると思います。
また、結果を見てもわかる通り、どちらも1〜10が足されて、55が出力されていることが確認できると思います。


while文

While文はfor文と同じく繰り返し処理を行うループ制御の構文です。While文はfor文と違い繰り返し回数が不明の場合(何回繰り返すかわからない、もしくは決まっていない場合)、使用します。記述方法としては、以下の2種類があります。

①繰り返し条件を始めに記載する方法
 ※繰り返し条件に一致しない場合、何も実行されない

    
while 繰り返し条件{
 繰り返す処理
}

②繰り返し条件を終わりに記載する方法
 ※繰り返し条件に一致しない場合、repeatに記載がある処理を1回だけ実行される

    
repeat{
    繰り返す処理
} while 繰り返し条件

※Swift2.0よりdoではなく、repeatを使うようになっています。

では、実際にPlaygrundでどういう動きをするか見てみましょう。
こちらでもfor文と同じく1〜10の足し算について、ソースコードを記述したいと思います。
    
var result1:Int = 0
var i:Int = 1
while i <= 10 {
    result1 = i + result1
    i++
}
print(result1)
var result2:Int = 0
var j:Int = 1
repeat {
    result2 = j + result2
    j++
} while j <= 10
print(result2)



条件分岐とループ制御については、以上です。
次回は、配列(Array)とディクショナリーについて説明したいと思います。