수행 내용

  • Human Interface Guidelines (HIG) for iOS 활동 학습
  • 묵찌빠 게임 프로젝트 Step 1 코드 리뷰 바탕으로 리팩터하여 push 후 완료 코멘트 포스트
  • 묵찌빠 게임 프로젝트 Step 2 의사 코드 작성
  • CaseIterable 프로토콜 학습
  • 개발자의 효율적인 문서 작성법 특강 일부 (~20분) 수강
  • 프로그래머스x최강iOS팀이 만나다! 세미나 참석

학습 내용

내가 얼마나 발전했는지 알아보려면?

  • 한 달 전 작성한 코드를 본다.
  • 학습한 내용을 마인드맵으로 그려본다.
    • 마인드맵 앱: Simple Mind Lite
  • 금요일 TIL에 마인드맵을 포함한다.

기준

  • 활동학습 했던 내용
  • 프로젝트 회고 항목

캠퍼들끼리는...

  • 물어볼 때도 부담 없이 물어보고
  • 거절할 때도 부담 없이 거절한다.
  • TIL Peer Review도 꼭 하자 (내 공부 급한건 두번째 우선사항, 내 공부는 혼자 할 수 있다)!

Human Interface Guidelines for iOS

iOS에서 사용하는 미리 알림 (Reminders) 앱에 HIG가 적용된 방식을 분석하여 스토리보드 형태로 표현

화면에 사용된 기본 UI 구성요소

화면 전환에 사용된 기법

Tab Bar vs Tool Bar

  • tapbar
    대 메뉴 이동 (앱 안에서의 기능별 분류를 해주는 화면간 이동을 할 수 있는 요소 (이동 시 별개의 흐름))
  • toolbar
    화면 안에서 어떤 액션을 취하고 싶을 때 사용 (새 요소, 목록 추가 등)

tableView

각 칸을 cell으로 지칭, 보통 cell content는 왼쪽, accessory view는 오른쪽에 나타냄 (disclosure indicator 등), tableView가 큰 단위로 묶인 것을 section으로 지칭.

Hierarchical Navigation

메뉴 하나를 탭하였을 때 더 깊은 곳으로 가도록 구성. 1 - 2 - 3 - 4 - 3 - 2 - 1 같이 작동. jump 안됨. 깊은 단계로 진입할 때 이전에 진입한 레벨들의 창이 덮히는 형식이기 때문에 생명주기가 계속 살아있는 상태. 빠져나오면 꺼짐.

Safe Area

안전하게 contents가 표시될 수 있는 영역을 뜻함.

정보의 흐름대로 깊어지는 내용 흐름이 이어진다.
폴더 - 메모 - 메모 데이터 형식.
ex) email

정보의 흐름을 해치지 않고 싶을 때 사용.
흐름 안에서 잠깐 해결하고 온다. (내려놓고 새로운 것을 잠깐 작성한다.) 잠시 다른 곳에 다녀온다.
ex) 웹페이지 팝업

CaseIterable 학습

  • 열거 타입에 CaseIterable 프로토콜을 채택하면 열거 타입 내 전체 케이스를 배열로 만든 allCases 배열을 활용할 수 있고, allCases.randomElement() 메서드를 활용하여 무작위로 열거 타입 내 케이스를 선정할 수 있다. 옵셔널 형태로 출력되므로 추출을 위해 옵셔널 바인딩이 필요하다.
enum RockPaperScissors: CaseIterable {
    case scissor, rock, paper
}

if let randomElement = RockPaperScissors.allCases.randomElement() {
    print(randomElement) // scissor or rock or paper
}
  • allCases 배열은 static 접두어를 통해 타입 프로퍼티로 재정의가 가능하다.
enum RockPaperScissors: CaseIterable {
    case none, scissor, rock, paper
    
    static var allCases: [RockPaperScissors] = [.scissor, .rock, .paper]
}

if let randomElement = RockPaperScissors.allCases.randomElement() {
    print(randomElement) // scissor or rock or paper
}

프로그래머스x최강iOS팀이 만나다!

현직 iOS개발자들의 주니어 iOS개발자, 예비 개발자들에게 전하는 메시지 (진입계기, 코딩테스트에 대한 의견, 포트폴리오, 커뮤니티 활동, 크로스 플랫폼에 대한 의견)

안내문
세미나 내용

개발자의 효율적인 문서 작성법

개발자의 글쓰기에 대한 이중민님의 특강
강의 내용 일부

문제점 / 고민한 점

프로젝트 관련

열거형에서 정의한 rawValue를 열거형 밖에서 활용하지 않는 방법

승패 판단(승리 케이스 = 상대방 수 % 3 + 1)에 활용하기 위해 가위바위보를 열거형에서 각각 1, 2, 3의 정수형으로 정의하였고, RockPaperScissors 타입 (게임 진행 관련 프로퍼티 및 메서드 구현 타입)에서 열거형 내의 값을 rawValue로 받아 처리하고 있었는데, 이런 사용 방법은 은닉화의 측면에서 진행이 덜 되었다는 피드백을 받았다. 확실히 처음 우리가 짠 코드를 접한다면 누구라도 rawValue가 어떻게 정의되어 있길래 이렇게 사용하였는지에 대해 궁금해할 것 같았다. 오늘 코드 리팩터링을 할 때 단순히 CaseIterable 프로토콜의 allCases 배열의 index값을 반환하는 메서드를 추가하여 rawValue 활용을 피했는데, 방금 전 별반 다를바 없다는 피드백이 왔다. 승패 판단을 위해 꼭 정수형으로 받아야하는데.. 고민이다.
또, 우리 코드의 경우 checkInvalidInput() -> Int 메서드에서 에러를 반환하는데 정수형으로 반환하여야 하기에 에러처리에 의미 없는 정수값을 활용하고 있다. 이것도 같이 풀어야할 숙제다.

해결 방법

  • 늘어가는 숙제.
  • [21. 2. 26. 문제] 옵셔널 바인딩은 if let 구문을 두 번 작성할 필요 없이 쉼표로 여러 변수, 상수들을 동시에 처리할 수 있다. 지금까지 옵셔널 바인딩 구문 안에 한 번 더 작성했었는데.. 그래도 변수명은 필요하구나.
if let userInput: String = readLine(), let intUserInput: Int = Int(userInput) { // 7 입력
	print(type(of: userInput), type(of: intUserInput)) // String Int
	print(userInput, intUserinput) // 7 7
}
profile
합리적인 해법 찾기를 좋아합니다.

0개의 댓글