Skip to content

iOS troubleShooting Week 1

dochoi edited this page Oct 30, 2020 · 13 revisions

iOS 문제 해결 과정 Week 1

2020/10/27(화)

Code convention

  • Swift Lint 를 이용합니다.

    협업에서 서로간의 코드 이해를 돕기 위해 Lint를 사용하여 Code convention을 맞췄습니다.

    Allman방식

    while x == y
    {
        something()
        somethingElse()
    }

    1TBS방식

    while x == y {
        something()
        somethingElse()
    }

    S060_최동규는 Allman방식, S065_홍동현은 1TBS방식으로 코드를 작성하였지만, 대부분의 swift sytle guide와 애플 공식 문서에서 1TBS방식을 적용하여 1TBS방식을 따르기로 결정하였습니다.

Task List 양식

  • 구글 스프레드 시트를 이용

    일정에 따른 진행 속도를 맞추기 위해 한눈에 보기 쉬운 구글 스프레드 시트를 활용하였습니다.

Programmatically vs xib vs storyboard

  • 입력 View를 코드로 작성합니다.

    입력 View는 회원가입, 로그인 화면에서 재사용이 되어, storyboard보다는 xib나 코드로 작성하는 방식이 합당하다고 생각했습니다. 또한, xib 사용보다 코드로 작성하는 방식이 View에 대한 모든걸 제어하므로, 협업시 디버깅이 쉬워서, Programmatically 방식으로 입력 View를 만들기로 하였습니다.

Alamofire vs URLSession

  • Alamofire가 더 쉽게 구현이 가능하지만, 학습적인 관점에서 Apple의 기본 API인 URLSession을 이용하여 네트워킹 레이어를 구현하기로 하였습니다.
image

회원가입 화면 전환 방식 Modal vs Push

  • 상대적으로 작은화면을 보여주는 Modal보단 화면 전체를 보여주는 Push가 키보드가 올라오는 상황을 고려했을때 UX 측면에서 더 합당하다고 판단하였습니다.

회원가입 제목 표시 방식 NavigationBar Title vs Label

  • 회원가입 화면은 로그인 화면과 달리 프로토타입이 없습니다. NavigationController를 사용했기 때문에 NavigationBar Title로 회원가입 제목을 표시하기로 결정하였습니다.

class final 키워드 명시

  • final을 사용하는 것이 상속받지 않는다는 명시하고, 상속하지 않을 클래스를 final 로 선언해주면 컴파일러에게 선언된 함수를 찾지 않고 직접 호출해야 한다고 알려주어 함수 호출에 의한 오버헤드를 줄여 성능을 향상시킵니다.

    참고 Increasing Performance by Reducing Dynamic Dispatch

InputView width 레이아웃 제약

  • 화면에 비례해서 width가 조정이 되지만 최대 크기를 둬서 아이패드같은 화면이 큰 기기에서 너무 width가 길어지지 않게 제약을 두도록 구현하였습니다.

메서드 네이밍 configure vs setUP

자기 자신의 프로퍼티나 메서드에 접근할 때 self 명시

  • self 를 항상 명시한다면, 생략하는 것보다 명확하게 자기 자신의 프로퍼티나 메소드를 사용한다는 의도를 표현할 수 있습니다. 반대로, self 를 필요할 때만 명시하는 경우 코드가 간결해지고, 컴파일러에서 클로저 내부에서의 self 접근에 self 의 명시를 강제하기 때문에, 클로저 캡처로 인한 순환 참조가 발생할 가능성이 있는 부분이 눈에 띈다는 장점이 있습니다.

  • Swift 5.3 부터는 클로저 내부에서 [self], [unowned self] 와 같이 캡처 의도를 명확하게 선언하거나([weak self] 제외), 순환 참조가 발생하지 않는 값 유형의 캡처에 대해선 self 의 생략이 가능합니다. 순환 참조가 발생할 가능성이 있는 경우에만 self 를 붙여야 한다는 컴파일 에러가 발생합니다. Swift 의 업데이트 방향을 봤을 때 애플에서는 self 를 생략하는 것을 권장하는 것 같아 self를 꼭 필요할 때만 명시하기로 정했습니다.

    참고 SE-0269: Increase availability of implicit self in @escaping closures when reference cycles are unlikely to occur


2020/10/28(수)

Custom View를 배치할 때 코드로 추가 vs 스토리 보드로 추가

  • 스토리 보드로 전체적인 배치를 볼 수 있으므로 스토리보드로 추가를 선택했습니다.

비밀번호 isSecureTextEntry적용시 text textContentType oneTimeCode로 수정

  • StrongPassword로 자동완성이 나와서, 비활성화하기위해서 옵션을 설정했습니다.

네트워킹 프로토콜 네이밍

  • 무엇인가를 설명하는 프로토콜은 명사여야 합니다 (e.g. Collection)
  • 기능을 설명하는 프로토콜은 able, ible, ing 붙여야 합니다(e,g Equatable, ProgressReporting)
  • Network를 제공하는 기능을 하므로 NeworkServiceProviding이라는 이름을 선택하였습니다

StackView 내부의 버튼 고정값 너비 clipping 경고 메세지

  • StackView 내부에 고정 너비를 가진 버튼 두개를 추가하는 방식으로 배치했는데, 두 버튼이 겹칠수도 있다는 경고 메세지가 나왔습니다. 이를 해결하기 위해 너비를 고정으로 주지 않고 최소값으로 설정하여 해결하였습니다.
스크린샷 2020-10-28 오후 6 27 41 스크린샷 2020-10-28 오후 6 27 52

특정화면에서 NavigationBar hidden 처리

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.setNavigationBarHidden(true, animated: animated)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    navigationController?.setNavigationBarHidden(false, animated: animated)
}

2020/10/29(목)

회원가입, 로그인 화면간 관계도 제작

image

로그인, 회원가입 UI 완료

최대한 프로토타입과 유사하게 만들었습니다.

image image

SwiftLint 변수명 3글자 이상 수정

image

  • 2글자 변수명을 Lint에서허용하지 않아 이를 Lint에서 빼주었습니다.

Git Merge Conflict

  • 두명이서 작업을 나눠 진행하고 merge하는 과정에서 conflict가 발생하였습니다.

  • 확인해보니 서로 Model 폴더를 생성하여서 두 폴더의 해시값이 달라서 생기는 문제였습니다.



폴더를 하나만 남겨서 모든 Confilict를 해결하고 merge 하였습니다.

  • 두개의 폴더를 통합하여 해결되었다고 생각하고 merge를 진행했었는데, Xcode에서 폴더안에 파일을 인식하지 못하는 문제가 있었습니다.

변경사항에서 충돌로 잡히지 않는 두 폴더의 코드가 있었고, 이를 하나로 합쳐주어 수정하였습니다.

테스트코드에서 SwiftLint 룰 미적용

trailing-whitespace 룰을 제외했었는데, 테스트 코드에선 그대로 적용되어 경고 메세지가 표시되었습니다.

스크린샷 2020-10-29 오후 9 49 10

이를 해결하기 위해 .swiftlint.yml 파일 exclude 항목에 테스트 폴더들을 설정해뒀으나 해결되지 않았습니다.

스크린샷 2020-10-29 오후 9 49 31

좀 더 알아보니 .swiftlint.yml 파일의 위치가 문제였으며, 프로젝트 최상단으로 이동함으로써 해결하였습니다.

2020/10/30(금)

종종 헷갈려 Issue생성부터 Issue 완료까지의 Process를 정리하였습니다.

image

image

Product Backlog

🕸 Web

🍎 iOS


Progress

🗣 Daily Scrum
🧑🏻‍💻 회의록
🤔 회고록
🤼 피어세션

TroubleShooting

🌄 Frontend
⚙️ Backend
🍎 iOS

Ground Rule

📐 Common

🕸 Web

🍎 iOS


ETC

📄 API 문서
🕹 기술 공유
Clone this wiki locally