일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Protocol
- ios
- Refactoring
- RxCocoa
- uiscrollview
- 리팩토링
- MVVM
- tableView
- clean architecture
- swift documentation
- uitableview
- combine
- collectionview
- 리펙터링
- Observable
- 리펙토링
- UITextView
- ribs
- 애니메이션
- Clean Code
- map
- SWIFT
- UICollectionView
- Xcode
- rxswift
- Human interface guide
- 클린 코드
- HIG
- swiftUI
- 스위프트
- Today
- Total
목록2022/12 (32)
김종권의 iOS 앱 개발 알아가기
팩토리 메소드 패턴 인스턴스 생성을 팩토리라는 곳에서 담당하며, 이를 사용하는 쪽(클라이언트 코드)에서는 관심사를 분리하는 것 만약 새로운 인스턴스를 생성해야할때 팩토리 메소드를 사용하면 클라이언트 코드에서는 인스턴스를 만드는 별도의 코드수정을 안해도 되는 패턴 팩토리 메소드 패턴 예시 예제 데이터 - 때에 따라서 Circle 혹은 Rectangle을 그려야하는 상황 class Circle { func draw() { print("draw circle") } } class Rectangle { func draw() { print("draw rectangle") } } class ViewController: UIViewController { override func viewDidLoad() { super...
zip array에서 사용하는 결합 연산자 두 원소가 항상 같이 짝짓는 연산자 var array1 = [1,2,3,4,5] var array2 = ["a", "b", "c", "d", "e"] zip(array1, array2) .forEach { value1, value2 in print(value1, value2) } /* 1 a 2 b 3 c 4 d 5 e */ 만약 둘 중 하나가 없다면 짝짓지 못하므로 값 x var array1 = [1,2,3,4,5] var array2 = ["a"] zip(array1, array2) .forEach { value1, value2 in print(value1, value2) } /* 1 a */ merge, merging dictionary에서 사용하는 병합 ..
Tuist로 모듈화 최신 포스팅 글 목록 > https://ios-development.tistory.com/1303 1. Tuist로 모듈화하기 - 이미 존재하는 프로젝트에 적용 방법 2. Tuist로 모듈화하기 - 기본 개념 (Dynamic Framework, Static Framework, Mach-O, Embed & Sign) Framework 클릭하여 생성 JKCode.swift 파일을 만들고 샘플 코드 작성 init도 JKFramework모듈 밖에서 접근가능하도록 public으로 선언 public struct JK { public init() {} public func printTest() { print("JKCode") } } 만든 Framework는 디폴트로 dynamic library B..
빌더 패턴 인스턴스 생성 시, 필요한 값들에대해 단계적으로 개발자에게 인지를 시키며, 복잡한 생성로직을 사용하는쪽에서 모르게끔하는 방법 팩토리 패턴과 구분) 팩토리 패턴은 매개변수 모두 주입해야 사용 가능하지만, 빌더 패턴은 우선 인스턴스를 생성하고(인스턴스는 default value로 세팅된 상태) 필요한 프로퍼티의 값만 변경 빌더 패턴의 핵심은 확장성 House라는 클래스가 있을 때, 코드 여러곳에서 House라는 것을 생성 할 경우, 특정 매개변수들은 항상 동일한 값을 갖는 것이 존재할텐데, 이 값들을 사용하는쪽에서 매번 파라미터로 넘기는 코드가 있다면 지저분한 코드가 될 것 House 코드의 인스턴스를 생성할 때 단순히 House() 이렇게 만든 후, 필요한 값들은 setWindows(_:), s..
추상 팩토리 (Abstract Factory) 팩토리: 인스턴스를 생성하는 곳 추상: 일종의 protocol 추상 팩토리: 팩토리에서 인스턴스를 생성할 때, 인스턴스의 타입이 protocol으로 표현하여, 특정 구체적인 타입만을 리턴하는게 아닌 여러개의 타입을 리턴할 수 있게하여 확장성을 위해 사용 추상 팩토리 예시 SwiftUI의 NavigationView는 iOS 16.0 에서부터 deprecated가 되었으며, NavigationStack이 새로 생성 iOS 16 이하인 버전에서 적절히 사용방법? 추상 팩토리를 사용하여 해결이 가능 getNavigation() -> View라는 메소드를 정의하고 사용 ViewFactory의 getNavigation 메소드는 추상적인 뷰를 나타내는 some View ..
ProgressButton 특정 기능을 수행하고난 후 특정 시간내에 취소할 수 있는 카운트 다운을 시각적으로 보여주는 버튼 기능에 사용 구현 아이디어 원의 둘레는 CAShapeLayer와 CABasicAnimation을 통해 그리게끔 구현 애니메이션 끝난 경우 이벤트 수신은 CAAnimationDelegate를 통해 알림 안의 x 이미지는 UIImage 사용 구현 사용하는쪽 ProgressButton을 초기화하고, progress를 돌리고 싶은 경우 animate(startRatio:) 사용 class ViewController: UIViewController { private var progressButton: ProgressButton! override func viewDidLoad() { super..
Extendable tableVeiw 구현 아이디어 셀의 UI는 stackView에 label을 넣고 hidden을 on/off하며 펼쳐지거나 줄어들게끔 구현 데이터 소스 타입에 isDescHidden와 같이 플래그를 넣고, 확장하고 싶은 경우 isDescHidden을 false로 한 다음 해당 데이터 부분만 reloadRows(at:with:)을 통해 업데이트 reloadRows(at:with:)에서 애니메이션도 지정할수 있는데, 아래로 팽창하듯이 늘어나는 옵션은 UITableView.RowAnimation.automatic 사용 // 해당 셀 업데이트 tableView.reloadRows(at: [IndexPath(row: indexPath.row, section: 0)], with: UITableV..
일반적인 디코딩 방법 User라는 Codable 모델 준비 struct User: Codable { let id: String let name: String } JSONDecoder()를 사용하여 data형태로 변경 func getUserData() -> Observable { let user = User(id: "1", name: "jake") let encoder = JSONEncoder() guard let data = try? encoder.encode(user) else { return .empty() } return .just(data) } 디코딩 사용 JSONDecoder()를 사용하여 data를 디코딩하여 user모델로 변경 getUserData() .subscribe(onNext: { d..