프로젝트 회고- ① 📞연락처 관리 프로그램

longlivedrgn·2023년 1월 1일
0
post-thumbnail

📞연락처 관리 프로그램


guard문의 사용

  • 아래와 같은 if 문을 guard 문을 통하여 리팩토링을 해보았다.
func checkAgeError(age: String) -> Bool{
     if !age.allSatisfy({ $0.isNumber}){
         print("입력한 나이정보가 잘못되었습니다. 입력 형식을 확인해주세요.")
         return false
     } else if let changeToInt = Int(age) {
         if changeToInt >= 1000 {
             print("입력한 나이정보가 잘못되었습니다. 입력 형식을 확인해주세요.")
             return false
         }
     }
     return true
 }
  • 아래와 같이 guard문을 사용할 수 있었다.
func checkAgeError(age: String) -> Bool{
     guard age.allSatisfy({ $0.isNumber}) else {
         print("입력한 나이정보가 잘못되었습니다. 입력 형식을 확인해주세요.")
         return false
     }
     guard let changeToInt = Int(age), changeToInt <= 1000 else {
         print("입력한 나이정보가 잘못되었습니다. 입력 형식을 확인해주세요.")
         return false
     }
     return true
 }

iOS - guard VS if

iOS - , 와 &&의 차이점


네이밍

이름만 보고도 무슨 의미인 지 알 수 있도록 하자!

1. 함수 네이밍

  • 아래의 경우 함수의 이름이 calculateSlashNum인데 return 타입이 Bool이다. 따라서 return 타입과 함수이름이 맞지않는다.
func calculateSlashNum(input: String) -> Bool {
    if (input.filter{ $0 == "/" }.count != 2) {
        return false
    }
    return true
}
  • 따라서 아래와 같이 func 이름을 변경해주었다.
func validateSlashInput(input: String) -> Bool {
     if (input.filter{ $0 == "/" }.count != 2) {
         return false
     }

2. 변수 네이밍

  • 아래와 같이 type을 미리 알 경우, 네이밍을 할 때 type 이름을 다시 말해줄 필요가 없다.
var ContactSet : Set<Contact> = []
  • 아래와 같이 변수 명을 바꿔주는 게 좋다!
var contacts : Set<Contact> = []

enum의 사용

사용 예 1)

→ 반복되는 출력문을 enum을 묶자.

  • 아래와 같이 enum을 생성하자.
enum GuideText {
    static let menu = "1) 연락처 추가 2) 연락처 목록보기 3) 연락처 검색 x) 종료"
    static let selectMenu = "메뉴를 선택해주세요 : "
 }
  • 그리고 아래와 같이 rawValue를 가져와서 String을 출력할 수 있다.
print(GuideText.menu)
print(GuideText.selectMenu,terminator: "")

사용 예 2)

  • 아래와 같이 enum을 만들어보자
enum MenuType: String {
     case addContact = "1"
     case viewContactList = "2"
     case findContact  = "3"
     case exit = "x"
 }
  • 그러면 기존에 있던 코드(아래)
while !isMenuInputError {
     print(GuideText.menu)
     print(GuideText.selectMenu,terminator: "")
     guard let input = readLine(), input != "" else{
         continue
     }
     switch input{
     case "1":
         addContact()
     case "2":
         for contact in contacts.sorted(by: {$0.name < $1.name}) {
             print("- \(contact.name) / \(contact.age) / \(contact.phoneNumber)")
         }
         print("")
         continue
     case "3":
         print("연락처에서 찾을 이름을 입력해주세요 : ", terminator: "")
         guard let inputValue = readLine() else {
             continue
         }
         findContact(inputName: inputValue)
         continue
     case "x":
         isMenuInputError = true
         print("\n[프로그램 종료]")
     default:
         print("선택이 잘못되었습니다. 확인 후 다시 입력해주세요.\n")
         continue
     }
  • 아래와 같이 어떤 오류가 있는 더 명확하게 코드를 진행할 수 있다.
while !isMenuInputError {
     print(GuideText.menu)
     print(GuideText.selectMenu,terminator: "")
     guard let input = readLine(), let menu = MenuType(rawValue: input) else{
         print("선택이 잘못되었습니다. 확인 후 다시 입력해주세요.\n")
         continue
     }
     switch menu{
     case .addContact:
         addContact()
     case .viewContactList:
         for contact in contacts.sorted(by: {$0.name < $1.name}) {
             print("- \(contact.name) / \(contact.age) / \(contact.phoneNumber)")
         }
         print("")
         continue
     case .findContact:
         print("연락처에서 찾을 이름을 입력해주세요 : ", terminator: "")
         guard let inputValue = readLine() else {
             continue
         }
         findContact(inputName: inputValue)
         continue
     case .exit:
         isMenuInputError = true
         print("\n[프로그램 종료]")
     }

4. 연산 프로퍼티의 사용

연산 프로퍼티

  • 아래와 같이 연산프로퍼티(Read-only Computed Properties)를 struct 구조체에 만들어보자
struct Contact : Hashable {
     let name : String
     let age : String
     let phoneNumber : String

     var description: String {
           "- \(self.name) / \(self.age) / \(self.phoneNumber)"
        }
 }
  • 그리하여 아래와 같은 방식을 통하여 print문을 출력할 수 있다.
// contact는 Contact의 instance이다.
print(contact.description)

0개의 댓글