SearchBarのScopeBarで検索機能作成

#今回の内容
<img width="150" alt="1A383DF9-F4C7-4AC9-9499-A4B7EA40399B_1_105_c.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/a5b82c5f-e033-0458-6c17-aeb5ea67fa62.jpeg"> <img width="150" alt="14B73BD8-FB35-47D4-A04B-99FCE2639812_1_105_c.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/c9aff8da-529e-a8da-2e6e-e25c833423b4.jpeg">

#コードと簡単解説

## ScopeBarを表示

* `searchController.searchBar.scopeButtonTitles = ["Vで検索","Fで検索","Cで検索"]`で、`ScopeBar`に表示する値を決めます。

* 下記のコードには書いていませんが、`searchController.searchBar.showsScopeBar = Bool値`について
 * `true`だと、ScopeBarが常に表示された状態になります。
 * `false`だと表示されなくなります。
 * `searchController.searchBar.showsScopeBar = Bool値`を書かない場合`SearchBar`をタップした時に、上の画像の様に表示されました。

```Swift:

           ~~~~~~~~~~省略~~~~~~~~~~
    let searchController = UISearchController()

    override func viewDidLoad() {
        super.viewDidLoad()

           ~~~~~~~~~~省略~~~~~~~~~~
        navigationItem.searchController = searchController
        searchController.searchBar.delegate = self
        searchController.searchBar.scopeButtonTitles = ["Vで検索","Fで検索","Cで検索"]
    }
```

##ScopeBarがタップされた時の処理 

* `func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {}`は、ScopeBarがタップされた時に処理が働きます。

* 今回の場合、一番左のScopeBarがタップされたと仮定すると,`case 0`内の処理が働きます。
 * `searchController.searchBar.scopeButtonTitles`の`[0]番目`の値である`Vで検索`から`.prefix(1)`を使用して、最初の１文字目だけを取得します。（`V`が取得される）
 * 取得してきた、１文字目が含まれている`cellContentsArray`内の値を全て`searchResultArray`に入れます。
 * `title`には`”V”で検索中`と表示されます。
 * `tableView.reloadData()`でtableViewの表示を更新します。

```Swift:
func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {

        switch selectedScope {

        case 0:
            searchResultArray = []
            cellContentsArray.forEach { cellContent in

                if cellContent.contains(searchBar.scopeButtonTitles![selectedScope].prefix(1)){

                    searchResultArray.append(cellContent)
                    title = "”\(searchBar.scopeButtonTitles![selectedScope].prefix(1))”で検索中"
                    tableView.reloadData()
                }
            }

        case 1:
            searchResultArray = []
            cellContentsArray.forEach { cellContent in

                if cellContent.contains(searchBar.scopeButtonTitles![selectedScope].prefix(1)){

                    searchResultArray.append(cellContent)
                    title = "”\(searchBar.scopeButtonTitles![selectedScope].prefix(1))”で検索中"
                    tableView.reloadData()
                }
            }

        case 2:
            searchResultArray = []
            cellContentsArray.forEach { cellContent in

                if cellContent.contains(searchBar.scopeButtonTitles![selectedScope].prefix(1)){

                    searchResultArray.append(cellContent)
                    title = "”\(searchBar.scopeButtonTitles![selectedScope].prefix(1))”で検索中"
                    tableView.reloadData()
                }
            }

        default:
            searchResultArray = []
            title = "cellContentsArray"
            tableView.reloadData()
        }

    }
```

#全てのコード
```Swift:
import UIKit

class ViewController: UIViewController{

    @IBOutlet weak var tableView: UITableView!
    
    let searchController = UISearchController()
    
    let cellContentsArray = ["UITableView","UISearchController","UIView","UIColor","UICollectionView","UISwich","UIKit","UITextField","UIViewController","UILabel"]
    
    var searchResultArray = [String]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        navigationItem.searchController = searchController
        navigationItem.hidesSearchBarWhenScrolling = false
        
        title = "cellContentsArray"
        tableView.delegate = self
        tableView.dataSource = self
        
        searchController.searchBar.delegate = self
        searchController.searchBar.scopeButtonTitles = ["Vで検索","Fで検索","Cで検索"]
    }
    
   
}

extension ViewController:UISearchBarDelegate{
    
    func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
        
        switch selectedScope {
        
        case 0:
            searchResultArray = []
            cellContentsArray.forEach { cellContent in
                
                if cellContent.contains(searchBar.scopeButtonTitles![selectedScope].prefix(1)){
                    
                    searchResultArray.append(cellContent)
                    title = "”\(searchBar.scopeButtonTitles![selectedScope].prefix(1))”で検索中"
                    tableView.reloadData()
                }
            }
                
        case 1:
            searchResultArray = []
            cellContentsArray.forEach { cellContent in
                
                if cellContent.contains(searchBar.scopeButtonTitles![selectedScope].prefix(1)){
                    
                    searchResultArray.append(cellContent)
                    title = "”\(searchBar.scopeButtonTitles![selectedScope].prefix(1))”で検索中"
                    tableView.reloadData()
                }
            }
            
        case 2:
            searchResultArray = []
            cellContentsArray.forEach { cellContent in
                
                if cellContent.contains(searchBar.scopeButtonTitles![selectedScope].prefix(1)){
                    
                    searchResultArray.append(cellContent)
                    title = "”\(searchBar.scopeButtonTitles![selectedScope].prefix(1))”で検索中"
                    tableView.reloadData()
                }
            }
            
        default:
            searchResultArray = []
            title = "cellContentsArray"
            tableView.reloadData()
        }
        
    }
    
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        
        searchResultArray = []
        cellContentsArray.forEach { cellContent in
            
            if cellContent.contains(searchText) == true {
                
                searchResultArray.append(cellContent)
                title = "”\(searchText)”で検索中"
                tableView.reloadData()
                
            }else if searchText == ""{
                
                tableView.reloadData()
            }
        }
    }
    
    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
     
        searchResultArray = []
        title = "cellContentsArray"
        tableView.reloadData()
    }
    
}

extension ViewController:UITableViewDelegate,UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        
        return tableView.frame.size.height / 7   
    }
    
    func numberOfSections(in tableView: UITableView) -> Int {
        
        return 1        
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        return {() -> Int in
            
            switch searchResultArray.count > 0{
            
            case true: return searchResultArray.count
                
            case false: return cellContentsArray.count               
            }
        }()

    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        
        cell.textLabel?.text = {() -> String in
           
            switch searchResultArray.count > 0{
            
            case true: return searchResultArray[indexPath.row]
                
            case false: return cellContentsArray[indexPath.row]
            }
        }()
        
        return cell
    }
   
}
```

# 終わり
ご指摘、ご質問などありましたら、コメントまでお願い致します。