분류 전체보기 67

[기초] guard let

guard let 구문은 옵셔널 값의 바인딩을 확인하고, 조건이 만족되지 않으면 조기에 코드 블록을 종료하는 데 사용된다. 주로 옵셔널 값이 nil 인지 아닌지를 검사하고, 옵셔널 값을 안전하게 추출하여 사용하는 데에 유용하다. guard let 바인딩된상수 = 옵셔널값 else { // 옵셔널값이 nil인 경우 실행되는 코드 // 종료 또는 오류 처리 등을 수행 } 옵셔널값 이 nil인 경우 else 블록 내부의 코드가 실행된다. else 블록은 guard let 구문에서 옵셔널값이 nil인 경우 실행되는 부분입니다. 일반적으로 코드를 조기 종료하거나 오류 처리를 수행하는 데 사용된다. 예시 greetUser(name: String?) 함수는 전달된 name을 검사하여 옵셔널 값을 바인딩한다. 만약 n..

[Programming Study] SOLID

컴퓨터 프로그래밍에서 SOLID란 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙이다. 객체 지향에 대해서 모두가 알겠지만 객체 지향은 "누가 어떤 일을 할 것인가?" 가 핵심이다. 각자의 객체를 찾아내고 그것에 대한 역할을 정의하고 사용하는 것이 객체 지향 프로그래밍이라고 할 수 있다. 객체(object)? 객체는 속성(데이터), 동작(메서드)을 가진 것을 이야기 한다. 보통 클래스를 이야기하며, 예를 들면 '사람' 이라는 클래스는 '눈', '코', '입', '팔', '다리' 와 같은 속성이 있는 것이고, '걷기', '먹기', '말하기' 같은 동작을 가진 객체라고 볼 수 있다. SOLID 이제 본격적으로 SOLID에 대해서 공부해보자. SOLID는 SRP, OCP, LSP, ISP, DIP의 약자..

[Programming Study] 캡슐화에 대해서

캡슐화란? 캡슐화(Encapsulation)는 정말 중요하고 기본적인 개념 중 하나이다. 캡슐화란 데이터와 그 데이터의 메커니즘, 방법을 묶는 것을 이야기한다. 데이터와 코드가 보호되고, 캡슐화된 다양한 것들을 편하게 쓸 수 있게 된다. 정말 대표적인 예로는 버튼을 들 수 있을 것 같다. 캡슐화의 장점은 아래 세 가지가 있다. 보호와 안정성: 캡슐화된 데이터와 코드는 외부에서의 접근을 제한하여, 부적절한 변경이나 오용을 방지하고 데이터의 안정성을 유지할 수 있다. 응집성: 관련된 데이터와 코드가 함께 묶여 있어 코드의 응집성이 향상된다. 관련된 코드를 한 곳에 모아두므로 코드를 이해하고 유지보수하기 쉬워진다. 코드의 재사용성: 캡슐화된 단위는 재사용성이 높아진다. 다른 부분에서 해당 단위를 쉽게 가져와서..

[Programming Study] 추상화에 대해서

개발에서 추상화라는 단어를 자주 보게 된다. 추상화에 대한 내 생각과 공부내용을 정리해 보려 한다. 내가 생각한 추상화는 "단순하게", "편하게" 이다. 추상이란 구체적이고 세부적인 사항을 배제하고 중요한 개념에 집중하는 것을 말한다. 피카소의 그림이 정말 알맞는 예인 것 같다. 복잡한 멍멍이를 선하나로 나타내버렸다. 하지만 모두가 이것은 멍멍이를 그린 것이라는 걸 안다. 물론 프로그래밍과 그림에서 말하는 추상화는 정말 같지 않겠지만... 복잡한 것을 단순하고 편하게 그 본질을 표현할 수 있어야 한다. 그것이 모두가 가지고 있는 공통적인 것이 될 수 있고, 모두가 꼭 가지고 있어야 할 요소일 수도 있다. 실제로 내가 쓰고 있는 SwiftUI 도 추상화가 잘 되어있는 것 같다는 생각을 했다. 버튼을 넣으려..

[Programming Study] 싱글톤 패턴(Singleton pattern)

싱글톤 패턴의 의문 시작 아래와 같이 앱에 햅틱을 사용하다가 의문이 생겼다. class Haptic { static let instance = Haptic() func notification(type: UINotificationFeedbackGenerator.FeedbackType) { let generator = UINotificationFeedbackGenerator() generator.notificationOccurred(type) } func impact(style: UIImpactFeedbackGenerator.FeedbackStyle) { let generator = UIImpactFeedbackGenerator(style: style) generator.impactOccurred() } }..

[HIG] Toolbars

툴바는 도구 모음이라고 볼 수 있을 것 같다. 빠르게 기능을 제공하는 부분이라고 생각하면 될 것 같다. 권장 사항 툴바는 사용자가 주요 기능을 사용할 수 있게 하자 툴바에 너무 많은 아이템을 넣지 말자 macOS, iPadOS 의 경우 툴바를 기능별로 모아두자 툴바의 기능을 확실히 표현하는 아이템을 사용하라 일관성 있는 툴바 아이템을 제공하자 기본적으로 제공해주는 SF Symbol 을 사용하는 것이 좋다 툴바의 배경화면을 투명하게 하는것을 고려하자 링크 Toolbars | Apple Developer Documentation A toolbar provides convenient access to frequently used commands and controls that perform actions re..

SwiftUI/HIG 2023.06.16

[HIG] Tab bars

탭바는 네이베이션을 위한 뷰이다. 탭바는 다른 종류의 정보를 구분할 때 사용한다. 또한 사용자가 빠르게 다른 종류의 뷰를 왔다갔다 하는데 쓰인다. HIG에서 권장하는 Tab bar의 사용 탭바는 뷰의 이동에 사용하는 것이 좋다. 기능 버튼을 추가할때는 toolbar를 사용하자. 다른 뷰에 있을때 탭바를 항상 보이게 하자. 사용자가 집중해야 하거나 새로운 경험을 제공하는 경우 예외가 될수 있다. (모달뷰) 탭바는 최대한 적게 써서 유저의 혼란을 줄여주자. 구체적인 명사나 동사를 탭의 제목으로 활용하자. SF Symbol 을 사용하는 것을 권장한다. 비슷한 무드의 Tab Item을 사용하자. 개인적인 공부 TabBar 에 어떠한 아이콘을 넣어야 할지 고민한 적 있다. 색이 있는 아이콘을 넣어볼까? 화려한 ..

SwiftUI/HIG 2023.06.16

[SwiftUI] Lottie 사용하기

Lottie가 뭐죠? Lottie는 에어비앤비에서 개발한 JSON 기반의 애니메이션 라이브러리다. 아마 로티를 사용해 보면 정말 자연스럽고 부드럽고 귀엽게(?) 애니메이션이 팡팡 터지는 것을 경험할 것이다. Lottie에 대한 간단한 설명과 이것을 어떻게 사용할 수 있을지 알아보자. PNG, GIF, Lottie? 위는 PNG, GIF, Lottie의 크기 차이를 설명한 것이다. PNG, GIF는 픽셀이 보여서 만들어지기 때문에 계단현상과 깨짐 현상이 발생하게 된다. 그리고 픽셀 하나당 색상이 있어서 용량도 무거워진다. 하지만 Lottie는 JSON을 기반으로 하여 벡터 기반(선분, 면)으로 이루어져 있어서 깨지지 않는다. PNG(Portable Network Graphics)와 SVG(Scalable ..

[SwiftUI][WWDC 2023] Animation 정리

Animation에 진심인 나... 아래의 2023 WWDC 영상을 참고하여 정리한 자료이다. Explore SwiftUI animation - WWDC23 - Videos - Apple Developer Explore SwiftUI's powerful animation capabilities and find out how these features work together to produce impressive visual effects... developer.apple.com Animation 의 종류 SwiftUI Animation 에는 Timing curve, Spring, Higher order 정도로 분류될 수 있다. Timing curve 보통 애니메이션을 커스텀 할때, 아래 같은 그래프를 ..

[SwiftUI] Haptic 사용하기

아이폰에 진동을 주고 싶다면...? 아래와 같은 클래스를 사용하면 된다. HapticManager 를 불러와서 nofiticationOccurred 나 impactOccurred 를 사용하면 된다. class HapticManager { static let instance = HapticManager() func notification(type: UINotificationFeedbackGenerator.FeedbackType) { let generator = UINotificationFeedbackGenerator() generator.notificationOccurred(type) } func impact(style: UIImpactFeedbackGenerator.FeedbackStyle) { let ..