ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 201030 - TIL
    TIL/2021 2020. 10. 31. 01:31

    Swift Grammar

     

    iOS에서 델리게이트 패턴을 공부하다가 Dictionary 부분이 헷갈려서 다시 복습을 했다.

     

    Swift의 메모리 처리방식에 대해서 공부했다.

    • MRC(Manual Reference Counting)
    • ARC(Automatic Reference Counting) - Swift에서 사용
    • Reference Count
    • Strong Reference
    • Weak Reference
    • Unowned Reference
    • Unowned Optional Reference
    • Closure Capture List
    • Emplict String Capture

    개념은 이해를 했는데 내가 짠 코드에서 메모리 누수가 있는지 없는지 알 수 있을지가 걱정이다....

    처음 봤을 때는 어려웠지만 역시 다시 보니까 괜찮아졌다. 계속 복습하면 더 나아질 것이다!

     


     

    iOS

    TableView와 TextField의 Delegate pattern에 대해서 공부했다.

     

    그러면서 UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate 공식문서를 살펴봤다.

    developer.apple.com/documentation/uikit/uitableviewdatasource

     

    Apple Developer Documentation

     

    developer.apple.com

    이러한 Delegate Pattern문서들에 패턴이 있었다. 처음 읽기는 힘들었지만 다시 읽고 다른 것도 읽을수록 쉬워졌다.

    하지만 한번 보면 또 까먹기 때문에 시간 날 때 자주 봐줘야겠다.

     

    Delegate pattern는 이해하는데 문제가 없었는데. Data를 다루면서 딕셔너리 배열을 만드는데 어려웠다.

    딕셔너리도 아는 개념이고 배열도 아는 개념인데.... 이 둘이 합치니까 처음에 너무 헷갈렸다.

     

     

    let list = [
            ["도시이름": "서울시", "구이름": ["강남구", "서초구", "송파구"]],
            ["도시이름": "용인시", "구이름": ["수지구", "처인구"]],
            ["도시이름": "수원시", "구이름": ["영통구"]]
        ]

    이렇게 배열을 만드니까 어떻게 접근해야 할지 막막했는데 하나하나 천천히 살펴보니 어렵지 않았다.

     

     

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            if let guList = list[section]["구이름"] as? [String] {
                return guList.count
            }
    
            return 0 
        }

    [String] 에 접근하기 위해서는 먼저 list[section]으로 딕셔너리 배열에 접근한 후에 Key의 값으로 접근을 하면 [Any?] 배열로 접근을 할 수 있었다. [Any?]이기 때문에 속성을 사용하기 위해서는 TypeCasting을 해야 했고 그러고 나서 row의 값을 동적으로 알맞게 지정할 수 있었다.

     

    이후에 list를 구조체로 만들어버리니 이렇게 어렵게 접근을 안 해도 됐다.

     


     

    기념일 계산기

     

    날짜를 키보드로 입력받아서 ~~ 일째 되는 날을 출력하는 화면을 만들었다.

     

    기본 화면

    만약 형식에 맞지 않는 날짜를 입력한다면 경고창이 출력되게 만들었고 미래의 날짜만 계산하기 위해 -일째 되는 날을 입력하면 또 경고창이 출력되게 만들었다.

     

     

     

     

     

    제대로 된 날을 입력하면 이렇게 아래 Label에 출력이 된다.

     

     

     

     

    모든 코드가 button에 action으로 연결한 메서드에 구현됐으므로 코드를 한 번에 올린다!

     

     

    class ViewController: UIViewController {
        
        @IBOutlet weak var standardDayField: UITextField!
        @IBOutlet weak var afterDayOfStandardDayField: UITextField!
        @IBOutlet weak var calculatedDateLabel: UILabel!
    
        
        @IBAction func calculateDateButton(_ sender: Any) {
            let dateRegularExpression = #"([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))"#
            
            guard let StandardDateText = standardDayField.text,
                  StandardDateText.count > 0 else {
                presentAlert(message: "날짜를 입력해 주세요.\n예) 2020-01-01")
                return
            }
            
            guard let range = StandardDateText.range(of: dateRegularExpression, options: .regularExpression),
                  range.lowerBound == StandardDateText.startIndex && range.upperBound == StandardDateText.endIndex else {
                presentAlert(message: "올바른 날짜를 입력해 주세요.\n예) 2020-01-01")
                return
            }
            
            guard let afterDayText = afterDayOfStandardDayField.text,
                  let afterDay = Int(afterDayText), afterDay >= 0 else {
                presentAlert(message: "0이상의 수를 입력해 주세요.")
                return
            }
            
            let calendar = Calendar.current
            let dateFormatter = DateFormatter()
            dateFormatter.dateStyle = .full
            
            dateFormatter.dateFormat = "yyyy-MM-dd"
            
            guard let formattedStandardDate = dateFormatter.date(from: StandardDateText) else { return }
            
            calculatedDateLabel.text = dateFormatter.string(for: calendar.date(byAdding: .day, value: afterDay, to: formattedStandardDate))
    
        }
        
        
        func presentAlert(message: String) {
            let alert = UIAlertController(title: "경고", message: message, preferredStyle: .alert)
            let alertAction = UIAlertAction(title: "확인", style: .default, handler: nil)
            
            alert.addAction(alertAction)
            present(alert, animated: true, completion: nil)
        }

    날짜를 구별하는 방법은 Regular Expression을 이용하여 구별하도록 하였는데 날짜를 입력받지 말고 DatePicker를 이용하면 이러한 코드도 쉽게 줄일 수 있다.

    또한 이 모든 것을 메서드에 구현하지 않고 extension으로 빼낸다면 코드가 깔끔해질 것이다.

    이 코드는 일부러 extension을 사용하지 않고 구현한 코드이다!

     

     

     

     

     

     

    728x90

    'TIL > 2021' 카테고리의 다른 글

    201101 - TIL  (1) 2020.11.02
    201031 - TIL  (1) 2020.11.01
    201028 - TIL  (0) 2020.10.29
    201027 - TIL  (0) 2020.10.28
    201026 - TIL  (0) 2020.10.27
Designed by Tistory.