【Swift】NSUserDefaultsと配列【超基礎編】

##はじめに
NSUserDefaultsをまるまる一つのプロジェクトとして紹介しているサンプルがなかったので丁寧に紹介したいと思います。
今回はUITextFieldに入力した文字を配列に保存していき、ボタンを押すごとに配列をcount upして中身を確認するといった手順です。

##手順
###Storyboardの作成
UIはこんな感じです
![スクリーンショット 2015-06-28 22.24.01.png](https://qiita-image-store.s3.amazonaws.com/0/59590/6c20f40a-0b06-98bc-d64b-a1c3efde8daa.png "スクリーンショット 2015-06-28 22.24.01.png")

コードを見ていきましょう

###ViewControllerのコード
```swift:ViewController.swift
   import UIKit

class ViewController: UIViewController ,UITextFieldDelegate {
    
    @IBOutlet var textfield : UITextField!
    @IBOutlet var mylabel : UILabel!
    @IBOutlet var textNumOfArray : UILabel!
    @IBOutlet var textAtNum : UILabel!
    
    
    
    //空の配列を用意する
    var stringArray : [String] = []
    
    //中身を確認するためのnum
    var num = 0
    
    let defaults = NSUserDefaults.standardUserDefaults()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        textfield.delegate = self
        
        //昔"openKey"という鍵で保存したかどうか確認
        if((defaults.objectForKey("openKey")) != nil){
            
            //objectsを配列として確定させ、前回の保存内容を格納
            let objects = defaults.objectForKey("openKey") as? [String]
            
            //各名前を格納するための変数を宣言
            var nameString:AnyObject
            
            //前回の保存内容が格納された配列の中身を一つずつ取り出す
            for nameString in objects!{
                //配列に追加していく
                stringArray.append(nameString as String)
            }
            
        }
        
        //現在保存されているstringArrayの要素数を表示
        textNumOfArray.text = String(stringArray.count)
        
    }
   
   
```
viewdidLoadでは起動して始めに"openKey"という鍵で昔
NSUserDefaultsで保存したobjectがないかcheckします。

もしもあればそれを再度読み込む(格納)、無ければ中身は空の状態で始めます。

###続けて動作(@IBAction)を追加していきましょう  
  
  
  
```swift:ViewController.swift
   
   
       //配列に保存する
    @IBAction func save(){
        
        stringArray.append(self.textfield.text)
        
        //配列をopenKeyで保存
        defaults.setObject(stringArray, forKey: "openKey")
        defaults.synchronize()
        
        //現在保存されているstringArrayの要素数を表示
        textNumOfArray.text = String(stringArray.count)
    }
    
    

    //中身を確認する
    @IBAction func up(){
        
        //stringArrayの中身があることを確認
        if stringArray.isEmpty != true{
            
            //配列の要素数以上の数字になったらエラーをおこすので、越えたら0に戻す
            if num >= stringArray.count {
                
                num = 0
                
            }
            
            //配列の中身を表示してあげる
            mylabel.text = stringArray[num]
            
            //配列の何番目にいるのかを表示してあげる
            textAtNum.text = String(num)
            
            //配列の確認する番数を増やす
            num++
        }
        
    }
    

    @IBAction func clear(){
        stringArray.removeAll()
        defaults.removeObjectForKey("openKey")
        mylabel.text = ""
        textAtNum.text = ""
        textNumOfArray.text = ""
        
        //現在保存されているstringArrayの要素数を表示
        textNumOfArray.text = String(stringArray.count)
    }
    
    
    /*
    UITextFieldが編集された直後に呼ばれるデリゲートメソッド.
    */
    func textFieldDidBeginEditing(textField: UITextField){
        println("textFieldDidBeginEditing:" + textField.text)
    }
    
    /*
    UITextFieldが編集終了する直前に呼ばれるデリゲートメソッド.
    */
    func textFieldShouldEndEditing(textField: UITextField) -> Bool {
        println("textFieldShouldEndEditing:" + textField.text)
        
        return true
    }
    
    /*
    改行ボタンが押された際に呼ばれるデリゲートメソッド.
    */
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        
        return true
    }
    
    
}

```
 ここでは細かく"保存","表示","全消去"を実装しています
 独特のやり方かもしれないが配列の中身をボタンを押すごとに呼び出すようにしています。またエラーを起こさないように配列に含まれない番号はリセットされるようにしました。
 
 
##最後に
 いかがでしたでしょうか。githubにソースはあるのでぜひ確認してみてください。
 
 https://github.com/watakemi725/NSUserdefaultsSwiftTest