일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- collectionview
- ios
- uitableview
- Protocol
- tableView
- map
- 리펙토링
- swiftUI
- 애니메이션
- Clean Code
- RxCocoa
- uiscrollview
- rxswift
- Xcode
- UITextView
- 스위프트
- 리팩토링
- HIG
- ribs
- Observable
- swift documentation
- SWIFT
- UICollectionView
- clean architecture
- 리펙터링
- 클린 코드
- Human interface guide
- combine
- Refactoring
- MVVM
- Today
- Total
목록분류 전체보기 (1644)
김종권의 iOS 앱 개발 알아가기
POP가 탄생한 배경 절차지향은 모듈화가 힘든 단점 OOP는 모듈화는 용이하지만 상속의 상속과 같은 복잡도가 늘어나면서 결국에 기능 확장할 때 side effect가 생길 확률 존재 POP는 수평적 확장: 상속을 받지 않고 공통 기능 구현 가능 OOP에서 클래스를 상속하려면 오직 class타입(reference type)에만 되지만, POP는 enum, struct, class모두 확장 가능 POP의 장점 기능의 모듈화가 명확 (강제 구현하게끔 지정) 테스트 코드에 용이 (Builder클래스와 같은 곳에서 프로토콜 타입이고 주입해주는 쪽에서 해당 프로토콜을 구현한 부분을 주입해주면 주입해주는 쪽에서 테스트 코드로 새로운 구현부를 주입하여 다양한 테스트를 사용할 수 있음) Protocol Default I..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bDlqhF/btqQJEMXKkt/xZfbmHngSjYqrdKbxOHwuk/img.gif)
프레임워크 pod 'SideMenu' SideMenu로 사용 할 화면 추가 코드로 화면 초기화를 위해, 관련 protocol정의 import UIKit protocol StoryboardInitializable { static var storyboardName: String { get set } static var storyboardID: String { get set } static func instantiate() -> Self } extension StoryboardInitializable where Self: UIViewController { static func instantiate() -> Self { if #available(iOS 13.0, *) { let storyboard = UISto..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cfOxp3/btqQIWtrsrO/KiuA5ewvbuMIKWnHq2nvkk/img.gif)
* 한 프로젝트에 프레임워크를 추가하여 구분하기: ios-development.tistory.com/217 Toast View UIView를 interface builder로 초기화 할 때 사용될 함수를 common extension에 정의 // CommonExtension/Common/UIView public extension UIView { func xibSetup() { guard let view = loadViewFromNib(nib: type(of: self).className) else { return } view.translatesAutoresizingMaskIntoConstraints = false view.frame = bounds addSubview(view) view.fillToSup..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bPS4Sy/btqQpsGDQ6C/Dfu9BFBfd78Z4z6rfQKNDk/img.png)
푸시의 종류 로컬 푸시(local notificatino): 앱으로부터 push를 앱에 띄우는 것 - ios-development.tistory.com/386 서버 푸시(remote notificatino): 서버로부터 push를 앱에 띄우는 것 서버에서 푸시를 받는 원리 Apple Developer 홈페이지에서 push서비스와 함께 Identifiers등록 push서비스와 함께 certificates 발급 APNs에 디바이스 토큰 등록 Identifiers에 push등록 Certificates생성, Provisioning profile생성 방법은 여기 참고: ios-development.tistory.com/256?category=936128 디바이스 토큰을 APNs에 등록하는 원리 디바이스 토큰: i..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/2ZP2G/btq7bDReEHs/81Ii3f1WtJrwCxVtT7nEeK/img.gif)
* Dispatch Queue 개념 먼저 확인: ios-development.tistory.com/138 GCD의 개념 GCD(Grand Central Dispatch)는 iOS에서 thread pool(생성된 Thread들)을 관리하는 개념 Dispatch Queue: Thread safe하게 Thread들을 관리할 수 있는 도구 Queue의 종류에는 크게 두 가지 존재: Serial Queue, Concurrent Queue - Seirial Queue: Main Queue - Concurrent Queue: Global Queue Task의 종류에는 크게 두 가지 존재: sync, async QoS(Quality of Service): 우선순위 결정 Dispatch Group 기본 개념 Dispat..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/PDmOH/btqQwndwUnB/6mslHqOIVRtTC4mKiSmk2K/img.png)
Xcode로 부터 빌드를 하여 ipa를 받은 파일을 설치하는 방법 앱스토어 -> Apple Configurator 2 설치 빌드를 통해 생성된 ipa파일을 Apple Configurator2를 실행하고, 디바이스화면에 드래그앤 드롭하면 설치 완료
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bnW6lc/btqQptFSfxR/NFK8SbI0TMSYNUK9drAEHk/img.png)
UIBezierPath란 Bezier(베지에 곡선 할 때 베지에): 선분을 그릴 때 사용 CAShapeLayer란 CoreAnimation이라 하여 CAShapeLayer 객체를 이용하여 UIBezierPath의 색깔들을 바꿀 수 있고 view.layer에 추가될 수 있는 객체 원리 UIBezierPath객체로 선분을 그려줌 CAShapeLayer의 path에 위에서 만든 UIBezierPath객체.cgPath를 등록 CAShapeLayer로 스타일을 지정해준 뒤, view.layer.addSublayer(CASharpeLayer객체)로 추가 예제) UITextField 밑에 선분 그리기 UIBezierPath의 move(to:) 함수: 그려지는 시작 점 정의 UIBezierPath의 addLine(to..
* 기본 세팅: KeychainAccess 프레임워크, 프로젝트 구성 * 앱 첫 실행 시 정보를 삭제하는 원리: UserDefaults에 플래그 값을 넣어, 앱이 삭제되면 플래그값도 사라지는 것을 이용 UserDefaults에 첫 번째 실행하는 것인지 체크하는 부분 추가 Domain/CommonExtension/UserDefsults추가: 기존에 flag값이 존재하면 이전에 실행했던 것이고, flag값이 존재하지 않으면 첫번째 실행이라 판단 UserDefaults는 앱을 지우면 같이 지워지므로 확인 (keychain은 앱을 지워도 지워지지 않음) // // UserDefaults.swift // Domain // // Created by 김종권 on 2020/12/16. // import Foundati..