-
200923 - TILTIL/2021 2020. 9. 24. 03:07
Swift 문법
오늘은 열거형, 구조체, 클래스에 대해서 공부했다.
Enumeration
- 고정된 경우의 수를 표현하는 타입
- switch문과 같이 사용하는 방법
- 생략이 가능한 부분
- 파라미터의 이름에 Style이 들어가면 대부분 열거형
- Raw Value
- Raw Value 사용 이유
- Associated Value
이해하기 어려운 부분이 없었다. 주의해야 할 점은 열거형의 케이스는 숫자 리터럴 같이 고유한 값이다.
Structure and Class
- 둘의 차이점
- Instance
- Property
- method
- Initialization
- Initializer
- Value Type
- Reference Type
- Stack
- Heap
값 형식과 참조 형식의 차이를 알아서 둘의 차이를 이해할 수 있었다. 스택과 힙에 대해선 아주 자세히는 공부하지 않았다. 문법 공부를 한 사이클 돌면 CS 강의를 봐야겠다.
iOS
- 코드를 작성할 때 가독성을 위해서 한, 두줄을 띄어주자. 메서드나 익스텐션은 두줄 띄어주고 리턴문은 한 줄 띄어서 적어주면 가독성에 좋아진다. 하지만 불필요한 띄어쓰기는 자제하자.
- 이름을 보고 뭔지 알 수 있도록 접미어 붙이자. 일관성이 있어야 한다
- 아웃렛은 모아서 정렬하고 카테고리별로 주석을 달아두자
- 변수, 상수, 프로퍼티는 위에 모아 두자. (가독성을 위해)
이미지 넣기
class ViewController: UIViewController { @IBOutlet weak var imageView: UIImageView! // ?가 붙어있어서 ?? 로 없을때 nil을 반환하도록 했다. let beepeach = UIImage(named: "Beepeach") ?? nil override func viewDidLoad() { super.viewDidLoad() // 이걸 추가해야 화면에 나타났다. imageView.image = beepeach // Do any additional setup after loading the view. } }
이미지를 Assets 파일에 넣어둬야 한다.
메서드 안에 imageView.image = beepeach를 추가하지 않으니 화면에 나타나지 않았다.
데이터 관리 화면 만들기 수정
외형을 바꾸고 기능을 추가하려 했는데 Tableview 추가하려는 부분에서 막혔다... 그래서 코드를 더 간단하게 줄였다.
func sortList(personProperty: String, isAsending: Bool = true) { if personProperty == "name" { list.sort { isAsending ? $0.name < $1.name : $0.name >= $1.name } }else if personProperty == "age" { list.sort { isAsending ? $0.age < $1.age : $0.age >= $1.age } } }
전에는 딕셔너리의 배열로 구현했는데 구조체로 선언을 했다
struct Person { let name: String let age: Int }
age가 Int여서 정렬 문제도 생기지 않아 .compare(rhs, options: [.numeric]) == .orderedDescending 를 사용하지 않아도 됐다.
스위치로 분기하던 버튼들도 간단하게 줄였다.
// 세그먼트인덱스가 0 or 1 그리고 버튼이 On/Off 인 경우 4가지를 switch문으로 분기해서 출력 @IBAction func typeChanged(_ sender: UISegmentedControl) { let property = sender.selectedSegmentIndex == 0 ? "name" : "age" sortList(personProperty: property, isAsending: sortChangeSwitch.isOn) listTableView.reloadData() } // 세그먼트인덱스가 0 or 1 그리고 버튼이 On/Off 인 경우 4가지를 switch문으로 분기해서 출력 @IBAction func sortChangeSwitch(_ sender: Any) { let property = sortTypeSegment.selectedSegmentIndex == 0 ? "name" : "age" sortList(personProperty: property, isAsending: sortChangeSwitch.isOn) listTableView.reloadData() }
전과 비교하면 아주 많이 줄어들었다.
다음은 전체 코드이다.
import UIKit class ViewController: UIViewController { var list = [ Person(name: "가철수", age: Int.random(in: 0...100)), Person(name: "나영희", age: Int.random(in: 0...100)), Person(name: "다웅이", age: Int.random(in: 0...100)), Person(name: "라지우", age: Int.random(in: 0...100)), Person(name: "마이슬", age: Int.random(in: 0...100)) ] func sortList(personProperty: String, isAsending: Bool = true) { if personProperty == "name" { list.sort { isAsending ? $0.name < $1.name : $0.name >= $1.name } }else if personProperty == "age" { list.sort { isAsending ? $0.age < $1.age : $0.age >= $1.age } } } @IBOutlet weak var nameField: UITextField! @IBOutlet weak var ageField: UITextField! @IBOutlet weak var sortTypeSegment: UISegmentedControl! @IBOutlet weak var sortChangeSwitch: UISwitch! @IBOutlet weak var listTableView: UITableView! // 세그먼트인덱스가 0 or 1 그리고 버튼이 On/Off 인 경우 4가지를 switch문으로 분기해서 출력 @IBAction func typeChanged(_ sender: UISegmentedControl) { let property = sender.selectedSegmentIndex == 0 ? "name" : "age" sortList(personProperty: property, isAsending: sortChangeSwitch.isOn) listTableView.reloadData() } // 세그먼트인덱스가 0 or 1 그리고 버튼이 On/Off 인 경우 4가지를 switch문으로 분기해서 출력 @IBAction func sortChangeSwitch(_ sender: Any) { let property = sortTypeSegment.selectedSegmentIndex == 0 ? "name" : "age" sortList(personProperty: property, isAsending: sortChangeSwitch.isOn) listTableView.reloadData() } @IBAction func add(_ sender: Any) { let charSet = CharacterSet.whitespacesAndNewlines guard let name = nameField.text?.trimmingCharacters(in: charSet), name.count > 0 else { print("이름 없음") return } guard let age = ageField.text, age.trimmingCharacters(in: charSet).count > 0 else { print("나이 없음") return } let newPerson = Person(name: name, age: Int(age)!) list.append(newPerson) print(list) // reloadData에서 애니메이션 추가 listTableView.reloadSections(IndexSet(integer: 0), with: .left) nameField.text = nil ageField.text = nil nameField.becomeFirstResponder() } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } } extension ViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return list.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) let p = list[indexPath.row] cell.textLabel?.text = p.name cell.detailTextLabel?.text = String(p.age) return cell } // 삭제구현 스타일만 func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle { return .delete } } extension ViewController: UITableViewDelegate { // 삭제구현 코드작성 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { list.remove(at: indexPath.row) tableView.deleteRows(at: [indexPath], with: .automatic) } }
728x90'TIL > 2021' 카테고리의 다른 글
200926 - TIL (0) 2020.09.27 200925 - TIL (0) 2020.09.26 200921 - TIL (0) 2020.09.22 200920 - TIL (1) 2020.09.21 201919 - TIL (0) 2020.09.20