Swifitド素人が、「これさえあれば何とかなる」を目標に作ったメモ(随時更新)

### 前書き
この記事は、Swiftで詰まった際に、「あ、そういえば...」で検索が掛けれるよう、よく使う型なりメソッドなりを自分用にまとめたものである。

# Xcode

### Xcodeの各パーツ名(忘れそうなのだけ抜粋)

![xcode_parts_name.png](https://qiita-image-store.s3.amazonaws.com/0/91664/9a1c3047-13b2-01cb-f1a5-d1521124f75f.png)



# 基本文法

###条件分岐
- switch: 変数の値によって条件分岐
- if    : その他の条件分岐

###繰り返し
- while:　条件判定による繰り返し
- for  :  回数を指定した繰り返し

###メソッド
- タイプメソッド:  class func 関数名(引数) -> 戻り値の型 { 処理 }
- インスタンスメソッド: func(引数1名: 型, 引数2名: 型) -> 戻り値の型 { 処理 }
- init(): ソースコードでインスタンスを生成した時に呼ばれる
- 呼び出し: func(引数1値, 引数2名: 引数値)

###配列
- 定義:  ショートカット型    array: [要素の型] = [ ]
- 追加:   array.append(末尾に要素追加)
- 追加:  array.insert(要素, atIndex: 番号) : 指定番号に要素追加
- 削除:   array.removeAtIndex(順番)
- 繰り返し:  for ele in array{}

###辞書型
- 定義:  ショートカット型  dictionary: [キーの型:　値の型] = [“key1”: “value1”]
- 追加:  dic[キー] = 値
- 削除:  dic.removeValueFromKey(“key名")
- 繰り返し:  for (k, v) in dic { 処理 }

###ダウンキャスト
- AnyObject as? ダウンキャストさせる型 => 可能ならダウンキャスト。無理ならnilとして扱う(返り値はオプショナル型になる)
- AnyObject as! ダウンキャストさせる型 => 強制的にダウンキャスト。無理ならエラーを吐く

###optional型
- オプショナル型:  var num: Int?  
 その変数を利用するときに中身が無ければその時点で処理が終わる(エラーは吐かない)
- 暗黙的オプショナル型: var str: String!  
  その変数を利用するときに強制的にアンラップされる

###optional型の値の取り出し方
- 強制的アンラップ  optional!
    - 強制的にアンラップするので、中身がnilの時はアプリが落ちる
- オプショナルバインディング
  - if文で中身がnil or notの場合分け
  - 構文: if let home =  hoge?.fuga?.name { nilでない時の処理 }else{ nilの時の処理 }
- オプショナルチェイニング
  - optional型の中身があるなら処理実行、なければ中断
  - 構文: optional?.propaty  (※中身があっても返り値はoptional型になるので注意)

###シングルトン
- そのクラスのインスタンスが一つしか生成されないことを保証するデザインパターン
  - 定義方法: static var hogehoge = "piyopiyo"

###HTTP通信
1.info.plistを開く
2.項目に「App Transport Security Settings」を追加
3.要素名に「Allow Arbitrary Loads」を追加し、値をYESとする

###画面遷移
- Modal: ViewControllerに別のViewControllerが重なる
- Navigation Controller: 階層的に遷移する
- Tab Bar Controller: 並列的に移動する

###Segueの種類
- Show: NavigationControllerで使用。画面の右から次の画面が出てくる
- PresentModally: Modalで使用。下から上に次の画面が出てくる
  - Presentation: 新しいViewが元のviewに対してどれくらいの割合を占めるか
  - Transition:  画面遷移時のアニメーションを指定
     - Cover Vartical:　下から上。　最もよく使う。
     - Flip Horizontal:  回転。
     - Cross Dissolve: フェードイン
     - Partial Curl: 紙めくり
  - Animate: 画面遷移時にアニメーションするかしないか

###enum
  - 定義

   ```
    enum Hogehoge : Int{
          case Piyo = 0
          case Kero = 1
    }
   ```

  - 取り出し: Hogehoge(rowvalue: Int)

###MVC
  - Model: データ管理: NSObjectの継承
  - View: 見た目: UIViewを継承
  - Controller: 橋渡し: UIViewControllerを継承

###デリゲートとプロトコル
  - デリゲート: あるクラスでは担いきれない処理を他のクラスに任せること
  - プロトコル: 二つのクラスの仲介を担うもの

#####~ プロトコル宣言の手順 ~
1.プロトコルを宣言する（通知する側）

```
@objc protocol ModalViewDelegate {
    //通知先で使うメソッドを定義
    func modalView(text: String)
}
```

2.通知用のプロパティの宣言（通知する側）

```
weak var customDelegate: ModalViewDelegate?
```

3.任意のタイミングで、プロトコルに定義したメソッドを呼び出す（通知する側）

```
customDelegate?.modalView(textField.text!)
(渡したい値を送る処理)
```

4.プロトコルを読み込み、メソッドを使えるように準備する（通知される側）

```
class PiyoController: HogeController, ModalViewDelegate {
```

5.通知先を設定（通知される側）

```
modalView.customDelegate = self
```

6.通知されるメソッドを定義（通知される側）

```
func modalView(text: String) {
   label.text = text
}
#textで受け取った値を受け取った側で使いたいように定義
```

# 各クラスのプロパティやメソッドなど
## どこにも属さないやつ

- **arc4random()** : 乱数を生成 
  - 使用例: let number = arc4random() % 10   
    (0~9の乱数を生成)
- **appearance()**: あるクラスのプロパティに対して統一の値を与えるメソッド
  - 使用例: UITabBar.appearance().barTintColor = UIColor.redColor()
- **dispatch_async**: 処理をどのキューに担わせるか指定 
  - 使用例: dispatch_async(dispatch_get_main_queue(),{ self.reloadData() })  
    (self.reloadDate()の処理をメインキューに担わせる)
- **stringByTrimmingCharactersInSet(NSCharacterSet型)**: 文字から空白や改行を取り除く 

## 部品生成系

### UIViewController: 

##### ~~ プロパティ ~~
  - **view**: UIViewコントローラーが管理しているUIViewクラスのインスタンス

##### ~~ メソッド ~~
  - **presentViewController**: View Controllerの上にもう一つView Controllerを載せる
    - 使用例: self.presentViewController(alertController, animate: true, completion: nil)


### UIView

##### ~~ プロパティ ~~
  - **backgroundColor**: 背景色
  - **alpha**: 透明度
  - **flame**: 位置、大きさの情報
  - **userInteractionEnable** : 真偽値。falseにするとUIViewの下にある部品を操作できる。
  - **center**: UIViewの中心

##### ~~ メソッド ~~
  - **addSubView(追加するview)**: サブビューを追加する
    - 使用例:  view1.addSubView(view1)  
    (view1のサブビューにview2を追加)
  - **removeFromSubview**: view上に配置してある部品を取り除く
    - 使用例: view1.removeFromSubview()  
    (view1がスーパービューから取り除かれる)
  - **viewWithTag()**: InterfaceBuilderで設定したtagに紐づく部品を取得できる
    - 使用例: cell.viewWithTag(1) as! UILabel  
    (tag=1の部品を取得。as!でダウンキャストしないとUIViewのインスタンスとして扱われる)
  - **editButtonItem()**: Editボタンを生成する
    - 使用例: self.navigationItem.leftBarButtonItem = editButtonItem()
  - **animateWithDuration**: 部品をアニメーションさせる


### UILabel

##### ~~ プロパティ ~~
  - **text**: 文字の内容
  - **textColor**: 文字の色
  - **subView**: viewの持っているsubViewの一覧
  - **superView**: viewのスーパービュー
  - **layer**: 描画の情報を扱う(CALayerのオブジェクトにアクセス)
  - **font**: 文字のフォント
  - **textAlignment**: 文字の整列
  - **numberOfLines**: 文字の最大行数

##### ~~ メソッド ~~
  - **sizeToFit()** : labelの大きさを文字の大きさとテキスト内容に合わせる
    - 使用例: label.sizeToFit()
    

### UIButton

##### ~~ プロパティ~~
  - **titleLabel**: ボタンのタイトル
    - 使用例: button.titleLabel!.font = UIFont(name:"hoge", size: 15)  
    (titleLabel.に続けてUIViewのプロパティが使える)
  - **frame**: 位置や大きさに関する情報
    - 使用例: button.frame.size = CGSizeMake(100,100)
  - **center**: ボタンの中心
  - **selected**: 選択状態かどうか(Bool)

#### ~~ メソッド ~~
  -  **setTitle("タイトルのテキスト", forState: UIControlState型の値)**
    -  使用例: btn.setTitle("タイトル", forControlState: UIControlState.Normal)
  - **setTitleColor(UIColor型の値, forState: UIControlState型の値 )**
    - 使用例: btn.setTitleColor(UIColor.redColor(), forState: UIControlState.Normal)
  - **setImage(UIImage型の値, forState: UIControlState型の値)**
    - 使用例: btn.setImage(UIImage(named: "hoge"), forState: UIControlState.Normal)
  - **addTarget(タップ後のメソッドがある場所, action: "メソッド名", forControlEvent: UIControlEvent型の値)**
    - 使用例: btn.addTarget(self, action: "tapButton", forControlEvent: UIControlEvent.touchUpInside)


### UIImageView

##### ~~ プロパティ ~~
  - **image**: 画像
    - 使用例: imageView.image = UIImage(named: "hoge")
  - **contentMode**: 画像の表示モード
    - 使用例: imageView.contentMode = UIViewContentMode.ScaleAspectFill
    　- Scale To Fill: デフォルト。画像が全て収まる(縦横比は変わる)
      - Aspect Fit: 縦横比を保ったまま、imageViewに画像が全て収まるよう収縮
      - Aspect Fill: 縦横比を保ったまま、imageViewが画像で覆われる
  - **clipsToBound**: 画像が表示領域で切り抜かれるかどうか(Bool)


### UIImage

##### ~~ メソッド ~~
  - **imageWithRenderingMode()**: イメージの表示形式を指定
    - 使用例: UIImage(named: "hoge").imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)  
    (常にオリジナル画像を使用)


### UITextField

##### ~~ プロパティ ~~
  - **placeholder**: 文字入力前に薄く表示する文字
  - **clearButtonMode**: テキストフィールドのクリアボタンがいつ表示されるか指定
    - 使用例: textField.clearButtonMode =UITextFieldViewMode.Never
  - **clearsOnBeginEditing**: 編集が始まった段階で文字全消しするかどうか選択(Bool)
  - **enableReturnKeyAutomaticall**y: 空白でリターンキーが押せるかどうか選択(Bool)
  - **secureTextEntry**: パスワード入力モードかどうか(Bool)
  - **borderStyle**: ボーターのスタイル(UITextBorderStyle型の値を取る)

##### ~~ メソッド ~~
  - **resignFirstResponder()**: キーボードを閉じる
  - **isEmpty**: テキストが空かどうか判定
    - 使用例: texiView.text.isEmpty  
    (textが空ならtrueが、空でないならfalseが返ってくる)

##### ~~ デリゲートメソッド ~~
  - **textFieldShoudBeginEditing**: テキストフィールドにフォーカスする直前に呼ばれる
  - **textFieldDidBeginEditing**: テキストフィールドにフォーカスした直後に呼ばれる
  - **textFieldShouldReturn**: リターンキーを押した時に呼ばれる
  - **textFieldShouldEndEditing**: 編集終了の直前に呼ばれる
  - **textFieldDidEndEditing**: 編集終了の直後に呼ばれる


### UITextView

##### ~~ プロパティ ~~
  - **dataDetectorType**: textViewの中のlink自動検知とかを設定
    - 使用例: textView.dataDetectorTypes = UIDataDetectorTypes.Link
  - **editable**: 編集可能かどうか(Bool)
  - **textContainerInset** :textView内のpaddingを指定
    - 使用例: textView.textContainerInset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)

### UIScrollView

##### ~~ プロパティ ~~
  - **contentSize**: コンテンツの大きさ(CGRectMakeで値を作ってあげる)
  - **pagingEnabled**: スクロールビューの表示範囲でページをめくるかどうか(Bool)
  - **contentOffset**: スクロールビューの原点が現在、コンテンツのどの座標にあるか

##### ~~　メソッド ~~
  - **setContentOffset()**: スクロールビューのスクロール位置を指定
    - 使用例: scrollView.setContentOffset(CGPointMake(100,0), animate:true) 

##### ~~ デリゲートメソッド ~~
  - **scrollViewDidScroll(){}** : スクロールしている間、絶え間なく呼ばれる
  - **scrollViewDidEndDecelerating(){}** : (手動)スクロールが終了したら呼ばれる
  - **scrollViedDidEndScrollingAnimation(){}** : (自動)スクロールが終了したら呼ばれる

### UIAlertController

##### ~~ メソッド ~~
  - **UIAlertController(title: "", message: "", prefferdStyle: UIAlertControllerStyle型の値)** : UIAlertControllerクラスのインスタンス生成
  - **addAction**: アラートにアクションを追加していく
    - 使用例: alertCont.addAction(alertAction)
    

### UITableView

##### ~~ プロパティ ~~
  - **estimateRowHeight**: セルのMinの高さを指定
  - **rowHeight**: セルの高さを指定
    - 使用例: tableView.rowHeight = UITableViewAutomaticDimension　(高さ自動調節)
  - **accessoryView**: セルの右側
    - 使用例: cell.accessoryView = hogehoge
  

##### ~~　メソッド ~~
  - **dequeueReusableCellWithIdentifer("Identifer")**: InterfaceBuilderで設定したIdentifierに紐づくセル生成
  - **reloadDate()**: テーブルデータの再読み込み
  - **deleteRowAtIndePath(index)** :テーブルからセルの削除

##### ~~ デリゲートメソッド ~~
  - **tableView(numberOfRowInSection) -> Int{}** : 1セクション内のセル数を返す
  - **tableView(cellForRowAtIndexPath) -> UITableViewCell{}**:　セルの内容を返す
  - **tableView(heightForRowAtIndexPath) -> CGFloat{}** : セルの高さを返す
  - **tableView(titleForHeaderInSection) -> String{}**  : セクションのタイトルを返す
  - **tableView(heightForHeaderInSection) -> CGFloat{}**  : セクションタイトルの高さを返す
  - **numberOfSectionInTableView(tableView: UITableView) -> Int** : セクションの数を返す  
  - **tableView(commitEditingStyle)** : 削除や編集を選択した際に呼ばれる
  - **tableView(didSelectRowAtIndexPath)**: セルがタップされた時の処理

    ```
    switch editingStyle {
    case .Delete:
        self.todoCollection.todos.removeAtIndex(indexPath.row)
        self.todoCollection.save()
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Middle)
    case .Insert:
        //処理
        return
    default:
        return
    }
    ```
  - **tableView(moveRowAtIndexPath)**: セルの移動

    ```
    let todo = self.todoCollection.todos[sourceIndexPath.row]
    self.todoCollection.todos.removeAtIndex(sourceIndexPath.row)
    self.todoCollection.todos.insert(todo, atIndex: destinationIndexPath.row)
    self.todoCollection.save()
    ```
  - **tableView(canEditRowAtIndexPath)**: 編集できるセルの制限


### UITableViewCell

##### ~~ プロパティ ~~
  - **textLabel**
  - **detailTextLabel**
  - **imageView**

##### ~~ メソッド ~~
  - **UITableViewCell(style: UITableViewCellStyle型の値, reuseIdentifer: "String")** :セル生成


### UISegmentControl

##### ~~　プロパティ ~~
  - **selectedSegmentIndex**: 選択されたセグメント番号

###UINib: xibファイルをソース上で扱う
##### ~~ メソッド ~~
  - **UINib(nibName: "xibファイル名", bundle: NSBundle型の値)**: インスタンス生成
  - **registerNib(UINib型, forCellReuseIdentifier: "Identifier")**: xibファイルの登録










## 形のない部品生成系

### UIFont
##### ~~ プロパティ ~~
  - **UIFont()**: UIFontクラスのインスタンスを生成
    - 使用例: let font = UIFont(name: "font-family", size: 15)
  - **systemFormOfSize(サイズ)**: 文字サイズを指定してUIFontクラスのインスタンスを生成
    - 使用例: UIFont.systemFontOfSize(15)  
    (※Style:標準, FontFamily: デバイス指定のもの)
  - **boldSystemFontOfSize(サイズ)**: 上記の太字版

### UIColor
##### ~~ メソッド ~~
  - **UIColor.hogeColor()**: 指定した色の生成
    - 使用例: UIColor.whiteColor, UIColor.blackColor






## 状態や詳細の定義系

### UIControlState
##### ~~ プロパティ ~~
  - **Normal**: 通常状態
  - **Highlight**: タップ状態
  - **Selected**: 選択状態
  - **Disabled**: ボタン利用不可状態

### UIViewContentMode

##### ~~ プロパティ ~~
  - **ScaleAspectFill**: = Aspect Fill = 画像の縦横比を保ったまま、imageViewを覆う

### UITextFieldViewMode: テキストフィールドのクリアボタンに関する指定

##### ~~プロパティ ~~
  - **Never**: 表示しない
  - **WhileEditing**: 編集している間
  - **UnlessEditing**: 編集している時以外
  - **Always**: 常に表示

### UIDataDetectorTypes: 自動検知するデータの種類を指定

##### ~~ プロパティ ~~
  - **Address**: 住所
  - **Link**: URL
  - **PhoneNumber**: 電話番号
  - **All**: 上記全て

### UIControlEvent

##### ~~ プロパティ ~~

### UIAlertAction

##### ~~ メソッド ~~
  - **UIAlertAction(title:"タイトル", style: UIAlertActionStyle型の値, handler:{(引数) -> 返り値の型 in <ボタンタップ時の処理>}**

### UIAlertActionStyle

##### ~~ プロパティ ~~
  - **Default**: 標準(青文字)
  - **Destructive**: 赤文字
  - **Cancel**: キャンセル(一番下に固定)

### UITableViewCellStyle :セルの見た目を決める

##### ~~ プロパティ ~~
  - **Default**: 標準
  - **Subtitle**
  - **Value1**

### NSIndexPath

##### ~~ プロパティ ~~
  - **section**: セクション番号を取得
  - **row**: セクション内のセルのrow番号を取得





## 画面遷移系

###Segue関係のメソッド
  - **unwindToTap(segue: “Identifer”){}** :  unwindSegue(戻る様のSegue)を関連付ける  
  (戻る先のコントローラーに記述→StoryBoardで戻る元のExitとアクション紐付け)
  - **performSegueWithIdentifer(“Identifier”, sender: 遷移元のViewController)**: セグエの画面遷移を実行する
  - **dismissViewControllerAnimated(アニメートするか(Bool), completion: {(引数) -> 返り値 in <処理>})** : Modalで移動したViewを閉じる(閉じる側に記載)

### UINavigationController: 階層遷移
#####~~ メソッド ~~
  - **setNavigationBarHidden()** : NavBarを表示するかどうか(Bool + animate)

### UINavigationBar

##### ~~　プロパティ ~~
  - **barTintColor**: NavBarの背景色
  - **titleTextAttributes**: NavBarタイトルのフォントや色を指定
    - **NSFontAttributeName**: フォントの指定
    - **NSForegroundColorAttributeName**: フォントの色を指定
  - **tintColor**: NavBarのボタンの色
  - **translucent**: NavBarの曇りガラス効果(Bool)
  - **navigationItem**: NavBar上の部品(コントローラーからアクセスする)
    - 使用例: viewCont.navigationItem.rightBarButtonItem = UIBarButtonItem型の値
  - **right(left)BarButtonItem**: NavBar右(左)のボタン



### UIBarButtonItem

#####  ~~ メソッド ~~
  - **UIbarButonItem(title: "タイトル", style: UIBarButtonStyle型の値, target: self, action: "メソッド名")**: NavBarのボタン生成


### UITabBar

##### ~~　プロパティ ~~
  - **barTintColor**: TabBarの背景色
  - **viewControllers**: 紐付いているViewController(配列で一覧取得)
  - **tabBarItem**: TabBarのアイコン(ViewControllerからアクセス)
    - 使用例: viewController.tabBarItem = UITabBarItem(title:~~~~~~)


### UITabBarItem

##### ~~ メソッド ~~
  - **UITabBarItem(title: "タイトル", image: UIImage型, selectedImage: UIImage型)** :TabBarItemの生成
  - **setTitieAttributes**: TabBarItemのフォントやタイトルカラーを設定










## Web View系

### UIWebView

##### ~~ プロパティ ~~

##### ~~ メソッド ~~
  - **loadRequest()**: URLを読み込み、結果をUIWebViewクラスのインスタンスに表示
    - 使用例: webView.loadRequest("NSURSRequest型の値")
  - **goBack()**: 一つ前のviewに戻る
  - **goFoward()**: 一つ先のviewに進む
  - **reload()**: 現在のページの再読み込み
  - **stopLoading()**: webの読み込みをストップさせる

##### ~~ デリゲートメソッド ~~
  - **webViewDidStartLoad(webView: UIWebView型の値){}**: webの読み込みが始まったタイミング
  - **webViewDidFinishLoad(webView: UIWebView型の値){}**: webの読み込みが終わったタイミング


### WkWebView

##### ~~ プロパティ ~~
  - **URL**: 閲覧中のURL

##### ~~ メソッド ~~
  - **addObserver("監視元", forKeyPath: "監視対象", option: .New, context: nil)**  
    特定の要素に変化があればメソッドを呼び出す
  - **observeValueForKeyPath(引数色々)**  
    addObserverで登録した監視対象が変化したら呼ばれる
  - **removeOvserver("監視元", forKeyPath: "監視対象")**  
    監視対象の解除

##### ~~ デリゲートメソッド(定義は WkNavigationDelegate) ~~
  - **webViwe(didStartProvisionalNavigation)**: web読み込みが始まったタイミングで呼ばれる
  - **webView(didFinishNavigation)**: web読み込みが終わったタイミングで呼ばれる

### NSURLSession: URLを指定してデータを取得
##### ~~ メソッド ~~
  - **sharedSession()**: URLからデータをダウンロードするためのセッションを生成
  - **dataTaskWithSession(NSURLRequest型, completionHander:{(引数) -> 返り値型 in 処理}**: NSURLSessionDataTask型のタスクを設定。　
    - 注意: completionHander で登録した処理は別スレッドで行われる
  - **resume()**: 登録したタスクの実行
  - **parse()**: 解析の実行

### NSXMLPerser: XMLを解析
#####~~ メソッド ~~
  - **NSXMLPerser(data: NSDate型の値(返り値のXML))**: このクラスのインスタンスを生成

#####~~ デリゲートメソッド ~~
  - **parser(didStartElement){}**: 解析がスタートし、タグが読み込まれたタイミングで発火
  - **parser(foundCharacters){}**: 解析がスタートし、文字が読み込まれたタイミングで発火
  - **perserDidEndDocument(parser: NSXMLParser)**: 解析終了のタイミングで発火






## その他

### UIApplication

##### ~~ プロパティ ~~
  - **networkActivityIndicatorVisible**: インジケータを表示するかどうか
    - 使用例: UIApplication.sharedApplication().networkActivityIndicatorVisible = true

##### ~~　メソッド ~~
  - **opneURL("URL")**: 指定URLをサファリで開く
    - 使用例: UIApplication.sharedApplication().openURL(wkWebView.URL!)


### UIGestureRecognizer: ジェスチャーを認識

##### ~~　メソッド ~~
  - **UITapGestureRecognizer(target: "target", action: "action:")**: 画面タップでaction起動
  - **addGestureRecognizer("ジェスチャー")**: ジェスチャーを登録
    - 使用例: self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "action:")  
    (画面タップ時にaction実行)


### NSUserDefault: アプリが閉じても保存内容を保持するインスタンス