ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 200923 - TIL
    TIL/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

     

    • 코드를 작성할 때 가독성을 위해서 한, 두줄을 띄어주자. 메서드나 익스텐션은 두줄 띄어주고 리턴문은 한 줄 띄어서 적어주면 가독성에 좋아진다. 하지만 불필요한 띄어쓰기는 자제하자.
    • 이름을 보고 뭔지 알 수 있도록 접미어 붙이자. 일관성이 있어야 한다
    • 아웃렛은 모아서 정렬하고 카테고리별로 주석을 달아두자
    • 변수, 상수, 프로퍼티는 위에 모아 두자. (가독성을 위해)

     

    이미지 넣기

    ImageView에 이미지 넣기

    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
Designed by Tistory.