---
# System prepended metadata

title: 벨미

---

# 벨미 

## 뿌셔볼 것
- 고차함수 이용하여 코드로 뷰 넣어보기 !

## 목표: 코드로 세그먼트 컨트롤을 만들어 뷰 전환하기 
### 1번 방법: 2개의 뷰를 재사용하여 환면 전환하기

- segment control 코드로 추가
- view를 추가하면서 translateAutoResizingMaskIntoConstraint를 false로 두고 addSubview를 하면 왜 안나오는지 알게 됨 (그 이유는 레이아웃 즉, 자리를 잡지 않아서 우리가 보여주고 싶은 프레임에 보이지 않았음!!) 👍👍👍👍👍
- 그래서 NSLayoutConstraint.activate()를 사용하여 레이아웃을 잡아주었으나, view에 레이아웃을 걸었기에 밑에 사진과 같은 모양이 나왔음. 원하는 결과를 얻기 위해서는 view가 아닌 safeArea에 레이아웃을 걸어야하는 것임을 알고  `view.safeAreaLayoutGuide` 를 이용해 수정하였음. 


| <center> 변경 전</center> | <center> 변경 후</center> |
| -------- | -------- |
| <img src="https://i.imgur.com/YYBYdP8.png" width="200px"/>     | <img src="https://i.imgur.com/lvEqp2z.png" width="200px"/>|

```swift
// 변경 전
  NSLayoutConstraint.activate([
            firstView.topAnchor.constraint(equalTo: view.topAnchor),
            firstView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            firstView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
            firstView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
        ])

// 변경 후
        NSLayoutConstraint.activate([
            firstView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
            firstView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
            firstView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),
            firstView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor)
        ])
```
    
#### 의문점: 아직 뷰 체인지하지 않았는데, 왜 노란색뷰가 나왔지? 🤔🤔
<img src="https://i.imgur.com/m8QaLIx.png)" width="450px"/>

- 전체 뷰에 순차적으로 뷰를 추가했기 때문임!    

```swift
view.addSubview(firstView)
view.addSubview(secondView)
```

#### 뷰 전환하기
- 처음에는 segment 내부에 

```swift
// 세그먼트의 인덱스에 따라 값이 변하게 바꾸는 메서드
    @objc func changeView(_ sender: UISegmentedControl) {
        switch sender.selectedSegmentIndex {
        case 0:
            firstView.isHidden = false
            secondView.isHidden = true
            print("초록색")
        case 1:
            firstView.isHidden = true
            secondView.isHidden = false
            print("노란색")
        default:
            return
        }
    }

// 1. 세그먼트 내부에 적용해보았으나, 화면에 반영되지 않았음. 
    let segment: UISegmentedControl = {
        let control = UISegmentedControl(items: ["List", "Grid"])
        control.translatesAutoresizingMaskIntoConstraints = false
        control.addTarget(self, action: #selector(changeView(_:)), for: .valueChanged)
        return control
    }()

// 1-1. 뷰디드로드 자리로 옮김
    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationItem.titleView = segment
        createGridCollectionView()
        self.segment.addTarget(self, action: #selector(changeView(_:)), for: .valueChanged)
    }
```

##### 지연 저장 프로퍼티 ( lazy stored properties ), 계산된 프로퍼티 ( Computed Properties )

🌱 지연 저장 프로퍼티
- 값이 사용되기 전에는 계산 X

🌱 계산된 프로퍼티
- 클래스, 구조체, 열거형에 선언할 수 있다.

[🌏 공식문서](https://jusung.gitbook.io/the-swift-language-guide/language-guide/10-properties)
[📎 블로그](https://tdcian.tistory.com/302)
[📎 StackOverflow](https://stackoverflow.com/questions/48050058/swift-function-vs-lazy-var-vs-computed-property-difference)