일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- RxSwift
- vtable
- 전자출입
- weak self
- delays deallocation
- swift
- hitTest
- reversed
- BidirectionalCollection
- URLSession
- Custom Class
- ReactorKit
- ios
- MaxHeap
- binder
- 공백
- AVCaptureSession
- Responder chain
- DISPATCH
- UserDefaults
- Python
- readLine
- UIResponder
- Combine
- 사내배포
- moya
- 입력
- Asnyc
- async
- input
- Today
- Total
목록swift (14)
틈틈히 적어보는 개발 일기
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/SsSyJ/btsdtFWkyFX/ERVG9Cz00MsBEyNyDpDLRk/img.png)
Filtering basics 💡 기본적으로 filter {...} 의 효과와 동일함! 클로저 내부 결과(Bool)가 true이면 스트림이 지속되고, false라면 스트림이 걸러지게 됨 ⭐️removeDuplicates() RxSwift의 distinctUntilChanged() 와 동일 이전과 동일한 값이 방출될경우 해당 스트림을 필터링 함 Compacting and ignoring 💡 종종 publisher가 Optional 값을 방출하는 경우가 있거나 이벤트가 nil을 반환하는 경우가 있다! 이러한 이벤트를 다뤄보도록 하자 compactMap 클로저 내부 값이 대해 Optional이면 본래의 값을, nil 이라면 해당 이벤트를 방출하지 않음 ignoreOutput() 모든 이벤트를 무시함. 단 co..
Hello Publisher publisher는 두가지 이벤트를 방출함 값 (as element) completion event Hello Subscriber Subscribing with sink(_: _:) RxSwift의 subscribe(onNext: ) 와 동일 // Code Just(["myung", "sub"]) .sink(receiveCompletion: { print("오늘 스터디는?? \\($0)") }, receiveValue: { print("스터디 참가자: \\($0)") }) // Result 스터디 참가자: ["myung", "sub"] 오늘 스터디는?? finished Subscribing with assign(to:on:), assign(to: ) KVO 방식으로 값을 할당..
애플이 말하는 컴바인이란? “The Combine framework provides a declarative approach for how your app processes events. Rather than potentially implementing multiple delegate callbacks or completion handler closures, you can create a single processing chain for a given event source. Each part of the chain is a Combine operator that performs a distinct action on the elements received from the previous step.” - ..
import Foundation // Node = (index, value) typealias Node = (Int, Int) struct MaxHeap { private var nodes: [Int] = [-1] func print() { var from = 1 var to = 2 while to Int? { if nodes.count == 1 { return nil } nodes.swapAt(1, nodes..
![](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 값을 공백을 기준으로 잘라..