일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Asnyc
- delays deallocation
- ios
- 전자출입
- vtable
- async
- weak self
- Python
- BidirectionalCollection
- moya
- MaxHeap
- readLine
- Responder chain
- 공백
- URLSession
- binder
- UserDefaults
- RxSwift
- DISPATCH
- Custom Class
- input
- swift
- ReactorKit
- 사내배포
- reversed
- UIResponder
- AVCaptureSession
- Combine
- 입력
- hitTest
- Today
- Total
목록전체 글 (24)
틈틈히 적어보는 개발 일기
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Afwuu/btrzEBSgscJ/vn4YBrMWogvpznKW89xzAK/img.png)
Chapter 1: Hello, RxSwift 💡 RxSwift란? 비동기 및 이벤트를 활용하여 시퀀스(마블)와 함수형 스타일 프로그래밍을 도와주는 라이브러리 원문 RxSwift는 관찰 가능한 시퀀스와 함수형 스타일 연산자를 사용하여 비동기 및 이벤트 기반 코드를 작성하기 위한 라이브러리로, 스케줄러를 통해 매개 변수화된 실행을 허용합니다. Observables Rx의 기초이며 Observable는 T 타입의 데이터를 가지고 이벤트의 시퀀스를 발생시키는 객체. ObservableType protocol은(Observable가 채택하는) 다음 세가지 이벤트를 발생시킴. next 가장 최근의 데이터 값을 가지고 있음. observer가 값을 받을 수 있는 방법. 종료 이벤트가 발생하기 전 까지 Observa..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/uwzga/btryjFbk5yE/J7VQibAlkTskStkImqrt6K/img.png)
이전에 프로젝트를 진행하며 클로저 내부에서 self를 활용해야 했을 때 이 코드를 정말 자주 습관적으로 사용했다. { [weak self] _ in } guard let self = self else { return } 클로저 내부에서의 캡쳐링으로 인한 강한 참조를 방지하기 위해 `[weak self]`를 활용하기는 했는데 Optional을 해제하기 위해 저렇게 처리를 하다 보니 문득 이게 맞기는 한건가..? 내가 아무 생각 없이 사용하고 있지는 않는건가..? 라는 생각이 들었었고, 또한 강한 참조에 대해 공부할 필요를 느꼈다. 자연스럽게 `guard let self = self else { ... }` 를 사용하는 이유, 이에 대한 동작 원리, 그리고 `[weak self]`를 부르지 않고 바로 `se..
기존에 네트워킹을 위한 코드를 작성하면서 일부 중복 코드를 줄이는데에는 어느정도 성공했었다. 그러나 네트워킹 요구사항이 많아지거나 활용하는 기능들이 많아질수록 필요한 매개변수들이 많아졌다. // 기존 네트워킹 코드 func request(httpMethod: HttpMethod, endPoint: EndPoint, uri: String? = nil, params: [(String, String)] = [], type: T.Type, completion: @escaping(Result) -> Void) { // URLSession dataTask ... } 이렇게 API를 호출함에 있어 필요한 파라미터, 헤더 등등이 늘어날수록 `networkRequest` 메소드에 추가해야 할 파라미터도 늘어났고, 또한 ..
Swift에는 없는 자료구조인 queue와 deque를 O(1)로 어떻게 구현할까? 에 대한 질문을 받아서 확실한 대답이 아닌 추측으로 대답했는데 반은 맞은 것 같다. reversed()의 시간 복잡도가 O(1)임을 알고 있었는데, 이를 통해서 queue와 deque를 구현할 수 있지 않을까 생각했었다. 그래서 살펴보니 reversed()의 리턴 타입이 ReversedCollection 였었고, 이 ReversedColleciton을 다시 살펴보니 BidirectionalCollection 프로토콜이 채택되어 있었고 이를 다시 살펴보니 원하는 결과를 얻었다. BidirectionalColleciton이 단어 뜻 그대로 양방향콜렉션인데 index가 움직일 때마다 반대쪽에 위치하는 index도 동일하게 움직..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/lX1X5/btru9pQrODx/BoCtUME4MdCzxmH89MDkRk/img.png)
UIResponder에 대해 자료를 알아보던 중 Responder Chain에 대한 과정을 직접 확인하고 싶어 hitTest와 point를 활용하여 디버깅을 하던 중 흥미로운 점을 발견하였습니다 그전에 Responder Chain이란? 대부분의 UIKit에서 이용할 수 있는 UI 객체들(UIApplication, UIViewController, UIView 등..)은 UIResponder를 채택하고 있는 Responder 객체인데, 이를 통해서 객체들에게 발생한 이벤트를 처리할 수 있게 됩니다. 이벤트가 발생하면 UIKit은 Responder에게 이벤트를 전달하게 되는데 해당 Responder가 이벤트를 처리하지 않을 경우에는 다른 상위의 Responder로 이벤트를 전달합니다. -> 즉 "내가 처리할 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bA40RZ/btrrweeAyxW/8ZmiNd1YxrLHNKMKlSrHb1/img.png)
iOS 개발자로 면접을 진행하던 와중에 다음과 같은 질문을 받았습니다. 🧑🏻💻 프로젝트에서 final 키워드를 모든 class에 다 붙여 두셨는데 이유가 있나요? 🧑🏻💼 더이상의 상속을 하지 않겠다는 의미로 final 키워드를 모두 붙여주었습니다! 🧑🏻💻 그렇다면 final 키워드를 사용함으로써 상속을 막는것 이외에 다른 장점은 무엇이 있을까요? 🧑🏻💼 ...! 해당 질문을 받았을 때 정확히 알고있는 개념이 아니라서 컴파일 시간을 단축할 수 있겠다는 추측성 대답을 했는데 알고보니 이상한 대답을 한 것 같다ㅠㅠ 그래서 final을 쓰면 뭐가 좋은데? 문법적 의미 성능적 이점 final 키워드를 사용하면 위에서 언급한 상속을 막는것과 같은 문법적(컴파일이 안되는)의미와 더불어 성능적으로도 이점을 볼 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bS6j18/btq1FB5LUHI/EyMaFmLkcNjtipINop75v1/img.png)
백준 알고리즘을 풀던 중, 알고리즘은 아무리 생각해도 맞는데 왜 자꾸 런타임 에러가 날까... 싶어서 한시간 동안 삽질하다가 해결법을 얻어 화가난 나머지 글로 남겨봅니다. 이 글을 읽으시는 여러분은 이런 일을 겪지 마시길 :( while let line = readLine() { let testCase = line.components(separatedBy: " ") } 백준 문제를 풀다가 보면 간혹 입력을 무한정 받고(프로그램의 종료 지점을 명시하지 않은 문제!!!!), EOF를 기점으로 테스트 케이스가 종료되는 문제들이 있다. 다른 언어를 사용하면서는 한번도 이런 일을 겪지 않았는데 Swift로 알고리즘을 풀다가 이런 일이 발생했다. 그래서 해결은? // 여기서는 String 값을 공백을 기준으로 잘라..
파이썬에서는 집합 자료형을 지원하며 집합 자료형의 특징은 다음과 같다. Hashable 이므로 중복이 없다 순서(index)가 없다 데이터를 다룸에 있어 O(1)의 시간이 소요된다. set1 = set([1, 2, 3, 4, 5]) set2 = set([1, 3, 5]) # 합집합 print(set1 | set2) # 결과 -> {1, 2, 3, 4, 5} # 교집합 print(set1 & set2) # 결과 -> {1, 3, 5} # 차집합 print(set1 - set2) # 결과 -> {2, 4} 집합(set)에 내가 찾는 원소가 있는지 찾기. if find_value in set1: print("find_value가 set1에 존재합니다!") else: print("find_value가 set1에..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/PohAw/btqV8FtTpf8/AjWjjnKnUxmzO2SubWbsL0/img.png)
교내 앱센터 활동 중, 직속 부서인 전산원의 부탁으로 일반적인 QRCode 스캐너가 아닌 전자출입명부와 같은 특정 구역에서만 스캔이 가능한 스캐너를 만들 기회가 생겼습니다. 해당 앱을 제작하면서 알게되었던 지식들을 정리해보고자 합니다. 참고 자료 https://github.com/swieeft/QRCodeAndBarcodeReader https://github.com/gaebel/scanner-overlay ⭐️ 해당 프로젝트를 시작하기 전, 카메라 이용에 관한 권한을 반드시 획득해야합니다! 프로젝트의 Info.plist에 Privacy - Camera Usage Description 을 추가하여 앱 실행 시 권한을 요청합니다 . 작성이 되셨다면 앱 실행 시 다음과 같은 화면이 나올거에요! 먼저 QR코드..
공백을 기준으로 입력받은 값을 나누어 arr에 배열로 저장합니다. # split() 내부에 '(자를 문자)' 형식으로 특정 문자를 자를수도 있습니다. arr = input().split() # Input: 1 2 3 4 # Output: ['1', '2', '3', '4'] 각각의 문자를 int 형으로 변환하여 각 변수에 저장(매핑)합니다. # int 대신 다른 자료형을 사용할 수 있습니다. x, y = map(int, input().split()) # Input: 1 2 # Output: x = 1, y = 2 int 형으로 변환된 각 변수들을 list 형식으로 변환하여 저장합니다. arr = list(map(int, input().split())) # Input 1 2 3 4 # Output [1, ..