-
201030 - TILTIL/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
이러한 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