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に!を付与すると消えると思います。



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

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