-
[Swift] if case let 를 사용하여 불필요한 코드 줄이기iOS/🟠 Swift 2022. 1. 16. 21:53
안녕하세요🐶 이번 시간에는 if case let 패턴을 사용해 switch-case 구문의 boiler plate 를 줄여보도록 하겠습니다. 언제 쓰는가? 열거형을 처리할 때 보통 저는 switch-case 를 사용했었습니다. 단일 case 만을 처리하고 싶어도 같은 방법을 사용했습니다. 떡볶이 열거형을 예로 한 번 들어보자면: enum 떡볶이 { case 일반 case 치즈 } let 내떡볶이 = 떡볶이.치즈 switch 내떡볶이 { case .치즈: 치즈토핑얹기() case .일반: break; } 만약 더 많은 케이스가 있는데 하나만 처리하고 싶은 경우라면, default 문을 사용할 수도 있습니다. switch 내떡볶이 { case .치즈: 치즈토핑얹기() default: break } 이렇게 단..
-
[RxSwift] DisposablesiOS/🔁 RxSwift ⁄ Combine 2022. 1. 12. 23:03
subscribe 메서드가 반환하는 Disposable 프로토콜 타입 인스턴스. 옵저저블 자원 정리에 사용한다. 옵저버블 자원 정리에는 총 3가지 방법이 있다. completed, error 이벤트의 발생으로 자연적인 자원 정리 dispose() 호출 DisposeBag 에 추가하기 공식문서에서는 DisposeBag 에 추가하는 것을 추천한다. Disposable 을 DisposeBag 에 추가해 놓으면, DisposeBag 이 정리되는 시점에 같이 정리된다. let bag = DisposeBag() Observable.from([1, 2, 3]) .subscribe { print($0) }.disposed(by: bag) 자세한 내용은 여기서 Disposables 리소스 정리에 사용되는 객체이다. ww..
-
Could not find module 'Kingfisher' for target 'x86_64-apple-ios-simulator' 해결iOS/🛠 이슈와 궁금증 2021. 12. 27. 11:38
메시지 간단 해석 x86_64 시뮬레이터 용 Kingfisher 모듈을 못찾겠다. 대신 arm64 와 arm64 시뮬레이터 용 모듈은 찾았다. 에러가 발생한 상황 인텔 1명, M1 2명으로 진행중인 협업 프로젝트 저는 develop 브랜치에서 끌어와서 M1 으로 최초 빌드한 상황 왜 이 부분이 혼란스러운지? 나는 M1 맥북 프로를 사용하고 있다 (ARM 기반 맥) 시뮬레이터는 arm64 로 돌아갈 것이다 x86_64 시뮬레이터를 사용하고 있지 않다! Open using Rosseta 옵션으로 실행시키지 않음 발견한 원인은? 인텔 팀원이 타겟의 build settings 에서 Excluded Architecture 에서 arm64 로 설정해 놓았다. 아마 팀원이 반대의 경우 (M1 프로젝트를 인텔에서 빌드..
-
[RxSwift] ObservablesiOS/🔁 RxSwift ⁄ Combine 2021. 12. 20. 09:50
참고자료 KxCoding rayWendelich 목표 Observable 의 특징은? Observable 을 만드는 두 가지 방법을 이해한다 Observable 을 사용하는 방법을 이해한다 옵저버블이 뭔가요? Rx 의 심장 💗 Rx 에서 모든 것은: 시퀀스 이거나 시퀀스와 함께 동작하는 것들 Observable, Observable sequence, Sequence 는 모두 옵저버블을 가리키는 말 시퀀스인데 비동기 시퀀스이다. 시퀀스는 일정 기간 (유한 ~ 무한) 동안 이벤트를 생산한다. 이것을 이벤트를 방출한다고 표현한다. 옵저버블은 옵저버가 구독한다. 이벤트의 방출은 특히 마블 다이어그램으로 이해하면 편하다: 시간은 왼쪽으로 오른쪽으로 흐른다 ⏰ 마블 간 간격이 특정한 시간의 크기를 나타내는 것은 아..
-
[HIG] Onboarding (온보딩)iOS/🎨 UI ⁄ UX 2021. 12. 14. 01:07
온보딩 화면은 새로운 사용자와 복귀하는 사용자를 맞이하는 수단입니다. 1.새로운 사용자를 고려 2.복귀하는 사용자를 고려 빠르고, 재미있고, 앱 학습에 도움이되는 온보딩 경험은 사용자가 앱의 대부분을 이해하는데 도움을 줍니다. 사용자가 스스로 익히는 대신 말이죠. 온보딩은 앱 설정이 아니라 앱을 즐기는데 도움이되어야 합니다. 사람들은 앱 사용법을 학습할수 있는 기회에 고마워할 수도 있지만, 동시에 앱이 그냥 알아서 잘 작동하기를 바랍니다. 설정이나 라이센스 정보를 온보딩 경험에 추가하는 것을 피해야합니다. (Launching 에서 다루었음) 앱을 바로 시작할 수 있게 합니다 시스템이 런치스크린을 끄고 앱의 첫번째 화면을 보여줄때, 사람들이 바로 앱을 사용하고 즐길 수 있도록 해야합니다. 튜토리얼이나 인트..
-
[iOS] 커스텀 폰트를 적용해보자iOS/🤖 App 2021. 11. 6. 02:10
안녕하세요 🐶 이번시간에는 프로젝트에 커스텀 폰트를 적용시켜보겠습니다 사실 이건 공식문서에 방법이 너무 잘나와있어요... 그런데 제 사례도 보여줄겸 + 복습해서 잘 기억해먹으려고 쓰는 글입니당 제가 진행중인 프로젝트는 Roboto 라는 폰트를 사용하고 있었는데 실제 적용시켜보니 피그마와 다르게 표시된 것이 문제였어요 지적된 문제점은: 1. 숫자 0에 빗금이 가있어서 별로다 (기계적으로 보인다?) 2. 공백의 너비가 너무 크다 그래서 아직 추가될 요소가 많긴 하지만 디자인적 완성도가 떨어져보였습니다. Attritbuted String 을 사용할 수 도 있었지만 모든 텍스트요소에 이것을 적용하는데 드는 비용보다 폰트를 그냥 변경하는게 빠르겠다고 생각했고, 그래서 Spoqa Han Sans Neo 로 변경하기..
-
[iOS] init(nibName:bundle:)과 init?(coder:) 알아보기iOS/🤖 App 2021. 10. 25. 14:21
안녕하세요🐶 이번 시간에는 UIViewController 의 두 생성자에 대해서 알아보겠습니다. 이 글을 통해 생성자가 언제 어떻게 사용되는지 알게되었으면 좋겠습니다! UIViewController 문서에서 제공하는 ViewController 를 생성할 수 있는 방법 init(nibName:bundle) 알아보기 첫번째 전달인자 nibName nib 은 xib 혹은 storyboard 파일의 빌드의 결과물입니다. xib 파일로 정의한 VC 는 그 이름을 그대로 가지고 nib 파일로 변환됩니다. 따라서 ViewController.xib 는 "ViewController.nib" 으로 변환됩니다. nibName은 ViewController 가 되겠네요! 스토리보드는 조금 다릅니다. xib 와 달리 스토리보드는..
-
[iOS] clipsToBounds 와 masksToBoundsiOS/🤖 App 2021. 10. 19. 23:45
안녕하세요🐶 이번 시간에는 clipsToBounds 와 masksToBounds 를 알아보려고 합니다. UIView 와 CALayer CALayer 란? iOS 에서 모든 UIView 인스턴스는 기본적으로 하나의 CALayer 인스턴스를 가지고 있습니다. CALayer 는 시각적인 역할을 담당하는 오브젝트입니다. ( 콘텐츠 캐싱, 애니메이션 성능 서포트 등) 뷰의 레이어 인스턴스는 layer 속성을 통해서 접근할 수 있습니다. 레이어는 시각적인 역할에 맞게 다양한 관련 속성을 제공하고, 커스텀할 수 있습니다. 예를 들어 뷰의 모서리, 그림자, 회전과 같은 애니메이션을 표현할 때 layer 의 하위 속성을 사용합니다. clipsToBounds 는 UIView 의 하위 속성 중 하나입니다. masksToBo..
-
[Swift] Any 와 AnyObjectiOS/🟠 Swift 2021. 10. 16. 10:49
1차 수정: 21.10.17 안녕하세요🐶 이번 시간에는 Any 와 AnyObject 를 정리해보았습니다. 구체적인 타입이 아닌 아무 타입 으로 작업하기 위해 스위프트가 제공하는 두 가지 특별한 타입 Any 타입 변수에 넣어주는 것이 타입 컨버전이 아닌 타입 캐스팅임에 유의하자. Any 와 AnyObject 타입은 생성자를 제공하지 않는다. 아래는 캐스팅의 특징 👇🏻👇🏻👇🏻👇🏻 Casting doesn’t actually modify the instance or change its values. The underlying instance remains the same; it’s simply treated and accessed as an instance of the type to which it has b..