Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Jason] 2022 맛있는 코드 x 새싹 iOS앱 부트캠프 사전과제 PR #1

Open
wants to merge 1 commit into
base: 1_Jason
Choose a base branch
from

Conversation

JasonLee0223
Copy link

안녕하세요 Finnn!🙋🏻
새싹 과정을 지원하며 작성하였던 사전과제를 구현하였습니다.
작업한 내용은 POP의 Protocol Default Implimentation을 적용하여 최대한 클래스 또는 구조체에서 구현부를 줄여보려고 노력해보았습니다.
또한 guard-let 구문을 최대한 사용하여 Early Exit할 수 있도록
고민을 많이 해보았습니다!

최대한 core data를 사용하여 데이터를 관리하는 것까지 해보려고 노력했는데 작성하지 못한 점이 많이 아쉽네요...
구현은 성적 추가 및 변경부분까지 진행하였습니다.
바쁜 시간에 리뷰해주셔서 감사합니다!! 잘 부탁드립니다! 🙇🏻🙇🏻

🧑🏼‍💻 작업 목록

  • 학생 추가
  • 학생 삭제
  • 성적 추가
    • 성적 변경
  • 성적 삭제
  • 평점 보기
  • 종료

💭 학습 키워드

  • API Design Guidelines
  • Protocol Default Implimentation
  • Swift Syntax
    • Closure
    • Higher-Order Function (고차함수)
    • class vs struct
    • enum
    • Error Handling
    • Early-Exit (guard, if-let 구문)

🤔 고민과 해결

  1. 현재 원티드에서 주관하는 프리온보딩 iOS 1차 챌린지에 참여하고 있습니다.
    당시 사전과제로 동일한 과제가 주어져 1주일전에 먼저 경험해보았고 제출했던 내용이 있어 다르게 구현하기위해
    야곰님의 강의를 통해서 객체지향 생활체조에 맞춰 최대한 반영하려고 노력해보았습니다.

  2. 3가지 이상의 데이터타입 프로퍼티를 가진 타입을 구현하지 않도록 해보았습니다.

    struct DataTable: Equatable {
         var name: String
         var subject: String
         var grade: Grade
    
         init(name: String, subject: String, grade: Grade) {
             self.name = name
             self.subject = subject
             self.grade = grade
         }
     }
  3. Protocol Default Implimentation을 처음 사용해보았는데 extension으로 Protocol을 확장하여 메서드를 정의해보았습니다.

    // 일부 발췌
    protocol DataManager {
         func receiveUserSingleInputValue() -> String
         func receiveUserThreeInputValues() -> [String]
         func featureOf(compare inputValue: String) throws -> String
         func featureOf(same name: String, compare value: String) -> Bool
         func featureTo(add nameValue: String?) -> DataTable?
         func delete()
         func change()
     }
    
     extension DataManager {
         func receiveUserSingleInputValue() -> String {
             guard let inputValue = readLine() else {
                 return ""
         }
         return inputValue
     }
    
  4. 저번에 작성했던 코드와는 다르게 최대한 고차함수를 활영하여 코드를 작성해보았습니다.

    // 프리온보딩 사전과제로 제출했던 코드
    func deleteToStudent() {
         print("삭제할 학생의 이름을 입력해주세요")
         let inputName = readLine()!
         
         if (inputName != " " && inputName != "\n") || nameArray.isEmpty == false {
             repeat {
                 let deleteStudent = nameArray.filter{ $0 == inputName}
                 guard let takeOffArray = deleteStudent.first else {
                     print("\(inputName) 학생을 찾지못했습니다.")
                     return
                 }
                 print("\(takeOffArray) 학생을 삭제하였습니다.")
             } while nameArray.count == 0
         }
     }
    // 맛있는코드x새싹 제출코드
    func deleteToStudent() {
         printMessage.wishToDeleteStudentName()
         let inputValue = receiveUserSingleInputValue()
         let correctValue = getInvalidInput(receivedValue: inputValue)
         if correctValue == nil {
             return
         }
         
         guard let filterElement = dataTableArray.filter({ $0.name == correctValue }).first else {
             printMessage.notCollectDeleteStudent(inputValue)
             return
         }
         
         guard let findIndex = dataTableArray.firstIndex(of: filterElement) else {
             return
         }
         dataTableArray.remove(at: findIndex)
         printMessage.deleteStudent(inputValue)
     }

💬 실행 화면

학생 추가

학생추가

학생 삭제

학생삭제

성적 추가

성적추가

프로그램 종료

프로그램종료

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant