일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 애니메이션
- MVVM
- Refactoring
- 리펙토링
- clean architecture
- rxswift
- tableView
- uitableview
- SWIFT
- UITextView
- uiscrollview
- collectionview
- RxCocoa
- ribs
- swiftUI
- UICollectionView
- swift documentation
- 리펙터링
- Observable
- Xcode
- HIG
- Human interface guide
- 리팩토링
- map
- 클린 코드
- 스위프트
- ios
- Protocol
- combine
- Clean Code
- Today
- Total
목록ios (1096)
김종권의 iOS 앱 개발 알아가기

1. 갤러리 화면 만들기, 사진 첨부 - 앨범 가져오기 (PHFetchResult, PHAsset) 2. 갤러리 화면 만들기, 사진 첨부 - 사진 가져오기 (PHCachingImageManager, PHImageRequestOptions) 3. 갤러리 화면 만들기, 사진 첨부 - 갤러리 화면 UI 구현 방법 앨범과 사진 가져오는 방법 (이전글에 있는 내용 복습) Photos 모듈에서 제공하는 API를 사용 디바이스의 앨범을 먼저 가져오기 (PHFetchResult가 앨범을 의미) 앨범에 담긴 이미지 정보 가져오기 (PHAsset이 이미지나 비디오 정보를 의미) PHAsset을 가지고 UIImage 이미지 가져오기 (PHCachingImageManager가 요청한 크기에 맞추어 PHAsset으로부터 이미지..

1. 갤러리 화면 만들기, 사진 첨부 - 앨범 가져오기 (PHFetchResult, PHAsset) 2. 갤러리 화면 만들기, 사진 첨부 - 사진 가져오기 (PHCachingImageManager, PHImageRequestOptions) 3. 갤러리 화면 만들기, 사진 첨부 - 갤러리 화면 UI 구현 방법 앨범과 사진 가져오는 방법 (이전글에 있는 내용 복습) Photos 모듈에서 제공하는 API를 사용 디바이스의 앨범을 먼저 가져오기 (PHFetchResult가 앨범을 의미) 앨범에 담긴 이미지 정보 가져오기 (PHAsset이 이미지나 비디오 정보를 의미) PHAsset을 가지고 UIImage 이미지 가져오기 (PHCachingImageManager가 요청한 크기에 맞추어 PHAsset으로부터 이미지..

1. 갤러리 화면 만들기, 사진 첨부 - 앨범 가져오기 (PHFetchResult, PHAsset) 2. 갤러리 화면 만들기, 사진 첨부 - 사진 가져오기 (PHCachingImageManager, PHImageRequestOptions) 3. 갤러리 화면 만들기, 사진 첨부 - 갤러리 화면 UI 구현 방법 앨범과 사진 가져오는 방법 Photos 모듈에서 제공하는 API를 사용 디바이스의 앨범을 먼저 가져오기 (PHFetchResult가 앨범을 의미) 앨범에 담긴 이미지 정보 가져오기 (PHAsset이 이미지나 비디오 정보를 의미) PHAsset을 가지고 UIImage 이미지 가져오기 (PHCachingImageManager가 요청한 크기에 맞추어 PHAsset으로부터 이미지를 가져옴) 쿼리는 모두 PH..
Optional 타입 Optional 타입은 제네릭스를 받고, 그 제네릭스는 Optional 안에 감싼 값을 의미 Optional 타입은 enum이며, 2개의 case가 존재 none: 값이 없는 case some(Wrapped): 값이 있는 case enum Optional: ExpressibleByNilLiteral { case none case some(Wrapped) } Wrapped는 값이라는 의미 swift 내부적으로 값이 없으면 none 케이스를 갖도록하고, 값이 있으면 some 케이스를 갖도록 구현한 것 Swift-case 문에서 Optional Binding 활용 Optional 타입은 none아니면 some인데, some 케이스에서는 값을 바로 접근할 수 있으므로 Optional Bin..

1. Quick, Nimble으로 테스트 쉽게하는 방법 - Quick, Nimble 개념 2. Quick, Nimble으로 테스트 쉽게하는 방법 - describe, context, it, beforeEach 실제 코드에 테스트하는 방법 (RxNimble, 비동기 테스트 방법) Quick의 beforeEach 개념 * Quick의 decsribe, context, it 개념은 이전 포스팅 글 참고 beforeEach를 잘 활용하면 각 테스트 케이스마다 쉽게 데이터를 변경해가며 테스트할 수 있으므로 beforeEach를 먼저 이해하기 beforeEach: it() {} 블락이 실행되기전에 모든곳에서 호출됨 afterEach: it() {} 블락이 실행되고난 후 모든곳에서 호출됨 즉, it() 실행 기준으로..
1. Quick, Nimble으로 테스트 쉽게하는 방법 - Quick, Nimble 개념 2. Quick, Nimble으로 테스트 쉽게하는 방법 - describe, context, it, beforeEach 실제 코드에 테스트하는 방법 (RxNimble, 비동기 테스트 방법) Nimble이란? * Nimble (재빠른) 가독성 높은 테스트 assertion 라이브러리 예상한 결과와 실제 결과를 비교하여 테스트를 수행하고, 테스트가 성공한 경우 상세한 정보를 제공 글을 읽는 것처럼 쉽게 읽히는 assertion들을 제공 대표적으로 expect()와 뒤에 to, toNot, notTo 등이 존재 import Nimble expect(seagull.squawk).to(equal("Squee!")) expec..

스크롤 구분 방법 스크롤을 정교하게 컨트롤하다보면 사용자가 드래그하여 스크롤이 시작되었는지, setContentOffset(_:animated:)로 스크롤을 지정했는지 구분이 필요 ex) UIScrollView에서 스크롤 될 때마다 특정 처리를 하고싶은 경우 사용하는 didScroll 델리게이트에서 setContentOffset과 직접 드래그 했을때 구분하고 싶은 경우? extension ViewController: UITableViewDelegate { func scrollViewDidScroll(_ scrollView: UIScrollView) { print(scrollView.contentOffset) label.text = "\(scrollView.contentOffset)" } } 사용자가 드래..

AnyHashable Hashable을 wrapping하고 있는 구조체 @frozen public struct AnyHashable { public init(_ base: H) where H : Hashable public var base: Any { get } public static func != (lhs: AnyHashable, rhs: AnyHashable) -> Bool } Hashable이 있는데 굳이 이를 wrapping한 AnyHashable을 만든 이유? associatedtype을 사용하는 프로토콜인, "제네릭 프로토콜"을 콜렉션 타입으로 설정하면 컴파일 에러 발생 Hashable은 제네릭 프로토콜이므로 Hashable을 감싸서 콜렉션 타입에 유연하게 사용하기 쉽도록 하기 위해서 Any..