ViewModifier 프로토콜 을 이용한 Custom ModifierCustom Modifier를 생성할 수 있는 프로토콜모든 Modifier는 View로 반환이 된다.struct PurpleBackgroundModifier: ViewModifier { func body(content: Content) -> some View { content .font(.title) .padding() .foregroundColor(.white) .background(.purple) .clipShape(.capsule) }}//접두어에 as 남기면 내가 만든거다! 라는 표시extension View..
이전 게시글에서는 URLSession 코드에 Concurrency 를 적용하였고,이번에는 Alamofire에 적용을 해보았습니다!기존 코드func request(text: String, sort: String, itemNumber: Int, completionHandler: @escaping (Result) -> Void) { ... DispatchQueue.global().async { URLSession.shared.dataTask(with: url) { data, response, error in guard error == nil else { return } guard let data = d..
Concurrency를 학습한 기념으로, 약 4달전 작성하였던 GCD를 적용한 Network Code들을 리팩토링 해보고자 합니다!기존 코드func request(text: String, sort: String, itemNumber: Int, completionHandler: @escaping (Result) -> Void) { ... DispatchQueue.global().async { URLSession.shared.dataTask(with: url) { data, response, error in guard error == nil else { return } guard let data = data else ..
프로젝트를 진행하다보니, UserDefaults 값을 이곳 저곳 쓸일이 많았고 반복되는 코드들에 불편함을 느껴@propertyWrapper 속성을 사용하여 코드의 간결함, 유지보수에 보탬이 되도록 개선해보려 합니다.기존 방식enum UserDefaultsKey: String { case userId case email case password case accessToken case refreshToken case nick case profileImage case autoLogin var key: String { return self.rawValue }}UserDefaults.standard.set("user@example.com", for..
문제점제공받은 API를 사용하다보니, performRequest 메서드는 응답값이 있는 통신만 가능하였고, 응답값 없이 응답코드만 전달해주는 통신에서는 오류가 발생하였다.임의로 빈 Struct를 만들어서 decodingType에 넣어봐도 실패하였다.아래의 메서드로는 서버 요청시, response status code만 주고 response값이 없는 요청은 받을 수가 없었습니다. static func performRequest(route: Router, decodingType: T.Type?) -> Single { return Single.create { single in do { let urlRequest = try route.asURLRe..
Service Level Project를 구현하다 보니, 기존에 작업하였던 Project에 비해 수 많은 API 통신 메서드가 필요하였습니다.처음 프로젝트를 시작할때는 로그인, 회원가입, 이메일 중복검사 만 이루어졌지만, 기능 구현을 차근차근 완성을 하다 보니 포스트 조회, 포스트 작성, 댓글 조회, 댓글 작성, 댓글 수정, 프로필 조회, 팔로우 조회 등등 수 많은 API 메서드를 작성하게 되었고,코드의 간결성 및 재사용성을 높이고 유지보수성을 개선하기 위하여 제네릭을 활용하여 메서드 통합 작업의 필요성을 느끼게 되었습니다.이전 코드struct NetworkManager { static func createLogin(query: LoginQuery) -> Single { return S..

이번 프로젝트에서는 IQKeyboard 라이브러리를 적용하여 회원가입, 로그인 뷰 등에서 키보드 관련 Layout 이슈는 없었다고 생각하였습니다.그치만 역시 세상에 쉬운 일은 없는법... Simulator에서 대부분 키보드를 Hide하여 테스트하다보니 이슈를 뒤늦게 발견하였습니다..댓글View를 상단에 TableView, 하단에 TextField 를 배치하였는데 TextField 클릭시 IQKeyboard 특성상 TableView의 전체가 모두 올라가버리는 이슈를 마주하였씁니다. 현상은 아래의 이미지와 같습니다!Issue Preview접근한 해결 방법우선 해당 뷰에서는 IQKeyboard 기능을 OffIQKeyboardManager.shared.disabledDistanceHandlingClasses =..
기존 코드버튼 태그 값을 이용하여 북마크 삭제 기능 구현private func configureDataSource() { let cellRegistration = UICollectionView.CellRegistration { (cell, indexPath, identifier) in cell.updateUIInBookmarkVC(identifier) cell.bookmarkButton.tag = indexPath.item cell.bookmarkButton.addTarget(self, action: #selector(self.bookmarkButtonClicked), for: .touchUpInside) cell..
- Total
- Today
- Yesterday
- Generic
- remakeconstraints
- DiffableDataSource
- network
- custommodifier
- layout
- API
- ios
- 빈배열
- accessibilityidentifier
- 라우터패턴
- TableView
- optimisticui
- tabman
- UserDefaults
- PropertyWrapper
- routerpattern
- SnapKit
- Xcode
- Concurrency
- 타입불일치
- Router
- Swift
- SwiftUI
- collectionView
- urlsession
- 한국관광공사
- Alamofire
- makeconstraints
- RxSwift
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |