[Swift] difference(from:)와 applying(_:)
·
Swift/개념 & 응용
difference(from:) difference(from:)은 두 개의 Collection 차이를 쉽게 구할 수 있는 메서드입니다. A와 B를 비교했을 때 무엇이 추가로 있고, 무엇이 없는지 알 수 있습니다. (A collection of insertions and removals that describe the difference between two ordered collection states.) 사용법도 간단합니다. let arr1 = [1, 2, 3, 4] let arr2 = [1, 3, 4, 5] let diff = arr2.difference(from: arr1) diff를 출력해 보면 arr1이 arr2가 되기 위해 무엇을 추가하고, 무엇을 빼야 하는지 알 수 있습니다. "Collect..
[Swift] 프로토콜 메서드의 매개변수 기본 값 설정 (Defining default parameters for protocol methods)
·
Swift/개념 & 응용
서론 프로토콜 타입을 사용할 때 불편한 점이 하나 있습니다. 메서드 파라미터에 기본 값을 사용할 수 없다는 점입니다. 예를 들어, UseCase의 execute 파라미터로 page를 전달해야 한다고 합시다. protocol UseCaseProtocol { func execute(page: Int) } struct UseCase: UseCaseProtocol { func execute(page: Int) { // Logic } } let useCase: UseCaseProtocol = UseCase() useCase.execute(page: 1) 그러면 위 코드처럼 항상 page를 전달해줘야 해요. page에 기본 값을 설정하고 싶어도 프로토콜 메서드에는 Default argument를 설정할 수 없다는 ..
[iOS] moti 개발일지 - 5. 보이스 오버(Voice Over)
·
iOS 프로젝트/moti(네이버 부스트캠프)
GitHub - boostcampwm2023/iOS02-moti: 네이버 부스트캠프 8기 iOS moti 앱 📸 네이버 부스트캠프 8기 iOS moti 앱 📸. Contribute to boostcampwm2023/iOS02-moti development by creating an account on GitHub. github.com 서론 moti는 더 나은 사용자 경험을 위해 노력한 앱입니다. 지금까지 작성한 인터랙션 애니메이션, 메모리 개선 등이 그 예시인데요. 이번 포스팅에서 다루는 보이스 오버도 더 나은 사용자 경험을 위해 적용한 기능입니다. 또한, 큰 기업 위주이지만 올해부터 모바일에도 접근성 지원을 필수로 적용해야 합니다. 접근성이 드디어 모바일에도 적용이 되는구나 느껴졌던 현상이에요. 이러한..
[iOS] moti 개발일지 - 4. 다운 샘플링과 메모리 캐시 개선
·
iOS 프로젝트/moti(네이버 부스트캠프)
GitHub - boostcampwm2023/iOS02-moti: 네이버 부스트캠프 8기 iOS moti 앱 📸 네이버 부스트캠프 8기 iOS moti 앱 📸. Contribute to boostcampwm2023/iOS02-moti development by creating an account on GitHub. github.com 서론 moti 앱은 사진이 핵심 콘텐츠인 앱입니다. 모든 곳에서 사진을 보여줘요. 그렇기 때문에 이미지에 사용하는 메모리가 많습니다. 이번 개발일지에서는 이미지에 소비되는 메모리를 줄이기 위해 도입한 다운 샘플링과 메모리 최적화 과정을 다뤄보겠습니다. 특별하진 않지만 매우 중요한 고민 과정이었습니다. 다운 샘플링이 필요한 이유 다운 샘플링을 적용하기 전, 팀원에게 다운 샘플..
[iOS] moti 개발일지 - 3. Interaction Animation
·
iOS 프로젝트/moti(네이버 부스트캠프)
GitHub - boostcampwm2023/iOS02-moti: 네이버 부스트캠프 8기 iOS moti 앱 📸 네이버 부스트캠프 8기 iOS moti 앱 📸. Contribute to boostcampwm2023/iOS02-moti development by creating an account on GitHub. github.com 서론 이번 포스팅에서는 인터랙션 애니메이션을 다룹니다. moti에서는 인터랙션 애니메이션도 하나의 도전 과제로 설정했습니다. 사용자 경험을 좋게 하기 위한 요소 중 하나라고 생각했기 때문입니다. 그래서 moti에는 어떤 인터랙션 애니메이션이 있는지, 구현을 하면서 어떤 어려움이 있었는지 말해보겠습니다. 인터랙션 애니메이션 적용 이유 처음 인터랙션 애니메이션에 대해 알게된건 ..
[iOS] moti 개발일지 - 2. 클린 아키텍처와 Swift Pacakage 모듈화
·
iOS 프로젝트/moti(네이버 부스트캠프)
GitHub - boostcampwm2023/iOS02-moti: 네이버 부스트캠프 8기 iOS moti 앱 📸 네이버 부스트캠프 8기 iOS moti 앱 📸. Contribute to boostcampwm2023/iOS02-moti development by creating an account on GitHub. github.com 서론 moti 프로젝트는 클린 아키텍처와 MVVM-C로 구조를 잡았고, Swift Pacakage로 모듈화를 진행했습니다. 클린 아키텍처를 선택한 이유와 코디네이터를 접목한 이유를 먼저 알아보고, 모듈화를 진행한 이유와 그중에서도 Swift Pacakage를 선택한 이유를 알아보겠습니다. 클린 아키텍처 moti는 클린 아키텍처로 레이어를 분리해 구조화했습니다. 레이어 분리가..
[iOS] moti 개발일지 - 1. 프로젝트 소개
·
iOS 프로젝트/moti(네이버 부스트캠프)
GitHub - boostcampwm2023/iOS02-moti: 네이버 부스트캠프 8기 iOS moti 앱 📸 네이버 부스트캠프 8기 iOS moti 앱 📸. Contribute to boostcampwm2023/iOS02-moti development by creating an account on GitHub. github.com 서론 moti 앱은 네이버 부스트캠프 8기에서 진행한 프로젝트입니다. 팀명은 모티메이트이고, iOS 2인, BE 2인으로 구성된 4인 팀이에요. 지금까지는 iOS가 저 한 명이었는데, 처음으로 iOS 협업을 경험한 앱이면서 가장 볼륨이 큰 앱입니다. moti는 어떤 앱인지, 개발하면서 어떤 고민을 했는지 작성해 보겠습니다. 이번 포스팅에서는 moti가 어떤 앱인지 소개하는 ..
[회고] 네이버 부스트캠프 웹・모바일 8기 그룹 프로젝트 3, 4주 차 회고 & 기술적 고민
·
경험 회고/네이버 부스트캠프 웹・모바일 8기
서론 최근 개발에 치여 포스팅을 많이 못했네요.. 어떻게 하면 더 잘 활용할 수 있을지 고민하는 주였던 거 같습니다. 3, 4주 차 회고를 묶어서 어떤 고민을 했는지 작성해 보겠습니다. 점점 커지는 프로젝트 4주 정도 개발하니 프로젝트가 점점 커지고 있습니다. (물론 현업 개발자분들이 보시면 코웃음 칠 사이즈지만요 ㅎ;) 프로젝트가 커지면서 다른 팀원이 작성한 흐름이 잘 안 보이기도 하고, 제가 작성한 흐름을 까먹기도 하고 있습니다. 어떻게 하면 이런 부작용을 줄일 수 있을까 고민하다 네이밍에 더 신경 쓰기로 했습니다. 아키텍처나 디자인패턴이 답일 수 있겠지만.. 마감까지 2주밖에 안 남은 상태에서는 불가능한 선택지였습니다. 그래서 최소한 네이밍이라도 명확하게 쓰자!라고 다짐했습니다. 동시에 extens..
[iOS] XCTest에서 비동기 테스트하기 (XCTestExpectation)
·
iOS/개념 & 개발
서론 UnitTest 사용해보기와 XCTest 성능 측정 (Command Line 환경)에서 UnitTest를 하는 방법과 성능 측정 방법을 다뤘습니다. 이전에는 동기 메서드만 테스트만 다뤄서 이번에는 비동기 테스트에 대해 말해보려고 합니다. 대부분의 앱에는 네트워크 통신이 필요합니다. 네트워크 통신은 오래 걸리는 작업이기 때문에 반드시 비동기로 처리해야 합니다. 같은 이유로 네트워크 테스트도 비동기로 테스트해야 하며, 다른 동기 테스트와 분리해야 합니다. 비동기 테스트 비동기 메서드를 동기 테스트 코드와 똑같이 테스트하면 제대로 테스트할 수 없습니다. 비동기 메서드의 결과가 나오기 전에 테스트 함수가 종료되기 때문입니다. 그래서 비동기 메서드가 종료될 때까지 기다리는 작업이 필요한데요. 이를 위해 XC..
[iOS] Xcode 15 #Preview 사용해보기 (+ 무선 Preview)
·
iOS/개념 & 개발
서론 Xcode 15.1 Beta에서 IBDesignable이 Deprecated 되었습니다. Xcode 15부터 생긴 #Preview 매크로를 적극 권장하기 위한 처리가 아닐까 생각이 들어서 이번 기회에 #Preview를 사용해 보기로 했습니다. 막상 사용해 보니 생각보다 더 편하고 유용해서 이렇게 포스팅까지 하게 되었네요. 특히 무선 Preview가 상상 이상이라 놀라웠습니다. 하나하나 천천히 살펴봅시다! Preview 관련 WWDC를 다룬 포스팅도 봐주시면 감사하겠습니다 ㅎㅎ #Preview #Preview를 사용하는 방법은 정말 간단합니다. #Preview { 보고 싶은 뷰 } 위 코드만 소스 파일 최상위에 적어주면 됩니다. 그럼 Xcode 화면이 분리돼서 Preview가 보입니다. Xcode가 ..
[WWDC23] Build programmatic UI with Xcode Previews
·
WWDC/iOS
What are previews Preview는 뷰를 구성하는 코드 스니펫입니다. #Preview 매크로를 사용하면 뷰를 반환합니다. Preview는 앱에 컴파일 되고, Xcode의 캔버스에 바로 나타나서 뷰를 미리 확인할 수 있습니다. Preview를 사용하면 개발자가 작업을 더 빨리 할 수 있습니다. 반복적인 일을 줄여주고, 불필요한 코드를 없앨 수 있기 때문입니다. Preview를 사용하고 소스 코드를 수정하면 Xcode는 두 가지 일을 동시에 처리합니다. 첫 번째는 어디가 변경되었는지 살펴보고, 최소한의 부분만 컴파일합니다. 두 번째는 Preview를 다시 실행합니다. 개발자가 코드를 수정만 하면 Xcode가 자동으로 최소한의 범위만 컴파일해서 Preview를 업데이트하는 것입니다. 심지어 여러 ..
[iOS] Delegate에 AnyObject 채택은 필수일까?
·
iOS/개념 & 개발
서론 언제나 그렇듯 아래와 같이 Delegate를 만들고 있었습니다. protocol OOODelegate: AnyObject { func ... } 근데 아차! 싶었습니다. Delegate에 왜 AnyObject를 붙여야 하지?라는 생각을 따로 안 해봤더라고요. 어렴풋이 알고는 있었지만 따로 생각을 해보거나 글로 정리한 적이 없어서 이렇게 포스팅하기로 결정했습니다. iOS에서는 언제 Delegate를 쓸까? Delegate는 Delegate를 채택하는 누군가에게 나의 행위를 위임합니다. Delegate를 사용하는 곳에서는 메서드를 호출만 하고, Delegate를 채택하는 곳에서 메서드를 구현하는 것입니다. iOS에서는 주로 유저 이벤트에 따른 행위를 구현할 때 Delegate를 사용합니다. 예를 들어,..
[iOS] FPS 측정하기 - CADisplayLink
·
iOS/개념 & 개발
CADisplayLink CADisplayLink는 화면의 업데이트 주기(VSYNC 주기)로 동작하는 타이머 객체입니다. CADisplayLink를 사용하면 디스플레이 주사율에 맞춰서 특정 함수를 호출시킬 수 있는데요. 애니메이션과 그래픽 렌더링을 정확한 타이밍에 수행할 수 있어서 더 부드럽고, 최적화할 수 있습니다. 또한, Actual Frame Rates와 Frames Per Second를 측정할 수 있습니다. Actual Frame Rates는 기기가 출력하는 초당 프레임 수를, FPS는 실제로 표시되는 프레임 수를 나타냅니다. 마지막으로 preferredFrameRateRange를 설정하여 프레임 수를 제어할 수 있습니다. OS가 알아서 최적화를 하지만 강제할 필요가 있는 경우 preferredF..
[Swift] NSCoding과 Codable 차이점 (상속 관계 유지하기)
·
Swift/개념 & 응용
NSCoding과 Codable Codable이 나오면서 NSCoding은 옛날의 그것으로 생각되었습니다. 그런데 NSCoding만이 할 수 있는 일이 있었습니다. 바로 상속 관계를 유지해서 저장하는 것입니다. Shape 부모 클래스를 상속하는 두 개의 자식 클래스가 있습니다. class Plane { var shapes: [Shape] init(shapes: [Shape]) { self.shapes = shapes } func display() { for shape in shapes { print("\(type(of: shape)): \(shape.description)") } } } let shapes: [Shape] = [ Rect(point: .init(x: 10, y: 10), size: .in..
[회고] 네이버 부스트캠프 웹・모바일 8기 멤버십 3주 차 회고 & 기술적 고민
·
경험 회고/네이버 부스트캠프 웹・모바일 8기
서론 이번 3주 차는 정말 너무너무 힘들고 어려웠습니다. 다형성이 어렵다고 생각은 했는데 이 정도일 줄은... 이번 회고도 쓸까 말까 고민했는데 짧게라도 남기기 위해 작성합니다. 이왕 시작한 거 빼먹으면 아쉬우니까요. 프로토콜과 다형성 Swift의 POP와 객체지향 OOP 사이에서 고민하는 주차였습니다. 특히 프로토콜에 프로퍼티를 넣는 것은 객체지향에 어긋나느냐? 하는 주제로 다른 캠퍼들과 의견을 나눴던 거 같아요. 1. Swift의 프로토콜에는 프로퍼티를 넣어도 자연스럽다. 프로토콜에 프로퍼티를 넣지 않으면 getter/setter 메서드를 넣어야 하는데 이건 Swift 스럽지 않다. 2. 프로토콜에 프로퍼티를 넣으면 객체지향의 캡슐화, 은닉화가 약해진다. 따라서 최대한 프로퍼티를 넣지 말아야 한다. ..
유정주
'ios' 태그의 글 목록 (2 Page)