일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- scene delegate
- Tuist
- claen architecture
- UIKit
- swift 점선
- domain data
- DP
- RxSwift
- uikit toast
- rxdatasources
- 타임라인 포맷팅
- coordinator
- BFS
- button configuration
- custom navigation bar
- custom ui
- swift concurrency
- swift custom ui
- custombottomsheet
- swift navigationcontroller
- reactorkit
- swift dashed line
- identifiable
- SWIFT
- swift 백준
- task cancellation
- task cancel
- traits
- 버튼 피드백
- swift bottomsheet
- Today
- Total
목록SWIFT (30)
김경록의 앱 개발 여정
📢 cornerRadius란?cornerRadius는 iOS의 모든 UIView가 갖고 있는 CALayer의 속성 중 하나로, 뷰의 모서리를 둥글게 만들어줍니다. 숫자로 지정한 반지름(radius)만큼 모서리가 잘려 둥근 사각형 형태로 렌더링되죠. 예를 들어, 버튼이나 카드 뷰에 부드러운 곡선을 주고 싶을 때 유용합니다.let roundedImageView: UIImageView = { let imageView = UIImageView() imageView.backgroundColor = .systemBlue imageView.layer.cornerRadius = 12 // 모서리를 12pt 만큼 둥글게 imageView.clipsToBounds = true // 내부 콘텐츠가 ..
iOS 앱 개발자라면 누구나 익숙한 AppDelegate 방식. 앱 생명주기의 중심이었죠.그런데 이제는… Apple이 SceneDelegate를 강제하려고 합니다.정말 AppDelegate는 사라지는 걸까요?그리고 우리는 지금 무엇을 준비해야 할까요?🌀 SceneDelegate가 뭐길래?iOS 13부터 도입된 Scene 기반 Life Cycle은 앱을 하나 이상의 "Scene"으로 나누어 관리할 수 있게 해줍니다.간단히 말하면, 앱의 UI 상태를 독립적으로 관리할 수 있는 구조죠.예를 들어 iPad에서 여러 개의 앱 창(윈도우)을 동시에 띄울 수 있는 것도 Scene 구조 덕분입니다.🔥 그런데 왜 지금 이렇게 중요한가?Apple은 iOS 18.4부터 다음 조건을 강제합니다✅ Info.plist에 UI..
🔊 개요앱을 만들 때 Button은 필수적이고, 자동으로 터치 피드백을 제공합니다.(눌렸을 때 색깔이 바뀐다던가)하지만 종종 버튼을 눌렀을 때 아무런 반응이 없는 것처럼 보이는 문제를 겪게 되죠.그럴 땐 대부분 아래 이유 중 하나입니다.👇 1. AttributedString에서 색상을 직접 지정한 경우(configuraton 사용 시)configuration 사용 시 폰트를 지정할 때 AttriibutedString을 사용하게 됩니다.그때 foregroundColor 또한 지정이 가능하며 이것으로 글자색을 바꿀 수도 있습니다. let attributedTitle = AttributedString( "이미지", attributes: AttributeContainer([ .font..

풀이 아이디어그리디 알고리즘 문제입니다.조건을 떠올리면 바로 풀 수 있는 문제인데30의 배수라는 조건을 떠올려보면,일단 끝이 무조건 0입니다.또 각 자릿수의 합이 무조건 3의 배수입니다. 이 조건을 따른 자세한 풀이는 아래와 같습니다. 풀이let n = readLine()!let arr = n.map { Int(String($0))! }// 0을 가지고있고, 배열 총합이 3의 배수인지 확인합니다.if arr.contains(0) && arr.reduce(0, +) % 3 == 0 { //숫자를 뺄수있는 문제가 아니므로 그냥 무조건 정답입니다. //다른 순서대로 섞어도 결국 각자리 합이 3의 배수가 안나오면 30의 배수가 될 수 없음 let result = arr.sorted(by: >).map ..

✅ 두 가지 스타일의 내비게이션 바 사용현재 프로젝트에선 다음과 같은 구조로 내비게이션 바 스타일이 나뉩니다:루트(첫 번째) 화면 → 로고 및 아이콘을 포함한 커스텀 스타일그 이후 푸시된 화면들 → 시스템 스타일 기반의 일반 네비게이션 바🎛 커스텀 네비게이션 컨트롤러에서 공통 처리이미 앱 전반에서 사용되는 커스텀 내비게이션 컨트롤러(InteractivePoppableNavigationController)가 존재하므로, 여기에 스타일 설정을 통합합니다.SceneDelegate 또는 AppDelegate에서 내비게이션 컨트롤러를 초기화할 수 있습니다:// SceneDelegatefunc scene(_ scene: UIScene, willConnectTo session: UISceneSession, opti..
Identifiable이란 무엇인가?Swift의 Identifiable은 각 객체가 고유한 ID로 식별될 수 있도록 하는 프로토콜입니다. 이 프로토콜은 id라는 고유 속성을 요구하며, id는 Hashable 및 Equatable을 준수해야 합니다. 이를 통해 컬렉션 내에서 객체를 빠르게 구분하거나 중복을 방지할 수 있습니다.protocol Identifiable { associatedtype ID: Hashable var id: ID { get }}기본적으로 UUID나 Int, String 등 Hashable한 타입이면 id로 사용할 수 있습니다. 언제 써야 하는가?Identifiable을 언제 사용해야 하는지는 주로 객체의 고유성을 식별할 필요가 있는지에 따라 달라집니다. 다음과 같은 경우 ..
✅ Single ?Single은 하나의 값을 방출(success)하거나, 에러(error)를 방출하는 RxSwift의 Observable 타입입니다.즉, Single는 "성공했지만 반환할 값이 따로 없다"는 의미를 가집니다.예제func test(email: String) -> Single { return Single.create { single in do { let request = try testTarget.test(email: email).asURLRequest() AF.request(request) .validate(statusCode: 200..🧐 언제 사용할까?✅ API 응답 값을 사용하지..
소프트웨어 아키텍처를 설계하다 보면 DTO(Data Transfer Object)와 도메인 모델(Domain Model)이라는 용어를 자주 접하게 됩니다. 이 두 가지 개념은 비슷해 보일 수 있지만, 각자의 역할과 책임이 명확하게 구분되어 있습니다.어느 순간 이 둘의 개념 명확히 분리하지 않고 사용하던 제 모습을 발견해서오늘은 DTO와 도메인 모델의 차이점, 그리고 왜 이들을 분리해서 사용해야 하는지에 대해 알아봤습니다. 1. DTO (Data Transfer Object)역할 및 특징데이터 전송 전용: DTO는 주로 네트워크 요청/응답, API 통신, 데이터베이스 결과 등의 외부 시스템과의 데이터 교환에 사용됩니다.단순 데이터 컨테이너: 비즈니스 로직이나 행동이 포함되지 않고, 오직 데이터를 담아 전..

유튜브나 인스타 등에서 유저의 시간 기록을 위와 같이 포맷팅 하는 방법에 대해 짤막하게 써보겠습니다.코드 import Foundationextension String { func timeAgo() -> String? { // ISO8601DateFormatter를 사용하여 입력된 날짜 문자열을 Date로 변환 let formatter = ISO8601DateFormatter() guard let inputDate = formatter.date(from: self) else { return nil } // UTC 시간대 기준으로 현재 시간을 가져옵니다. let calendar = Calendar.current g..

개요 우리 디자인팀이 제작해 준 게시글 자세히 보기 화면은 기본 뼈대 자체는 완성되어 있었지만, 기획 검토 중 유저가 선택한 사진의 개수와 태그의 개수가 유동적이라는 점에서 놓친 부분이 있었습니다.즉, 사진이나 태그가 전혀 없을 수도 있고, 일부만 있을 수도 있는 상황을 모두 고려해야 했습니다. 기존 80% 완성해놓은 뷰에 조건 별 제약 조건을 업데이트하는 과정을 글에 담았습니다.시도해 본 방식은 아래와 같습니다.1. 유저가 설정하지 않은 경우 해당 뷰의 높이를 0으로 지정하기단순한 접근으로 사진과 태그 영역의 높이를 0으로 지정하는 방식으로 처리해봤는데, 이 경우 이미 설정된 Constraints가 그대로 유지되어 글과 소셜 버튼 사이에 불필요한 간격이 발생했습니다.즉, 단순히 뷰의 높이만 0으로 만..