분류 전체보기
-
UIView 가 사라지는 타이밍은? like viewDidDisappeariOS 2025. 4. 25. 18:44
WKWebView처럼 뷰가 사라질 때 작업들을 해줘야 하는 경우가 있습니다.UIViewController 에선 다양한 lifeCycle 메서드를 제공합니다.따라서 viewWillDisappear, viewDidDisappear 를 비롯해 원하는 타이밍에 필요한 작업을 해줄 수 있습니다.하지만 UIView는 이런 lifeCycle 메서드를 세밀하게 제공해 주지 않습니다.그래서 보통 deinit 에서 해주곤 했었는데요.Swift 에서 isolated 개념이 강화되면서 deinit 에서 self를 참조할 수 없어 곤란한 상황들이 있습니다.deinit 에서도 캡처를 통해 기존처럼도 사용할 수 있지만, 메모리 이슈가 생길 위험이 있다고 생각이 들었습니다.그래서 뷰가 제거되는 좀 더 안전한 타이밍을 찾아보았습니다...
-
[Swift6] WebView 에서 워닝이 발생할 때iOS 2025. 4. 25. 13:47
Swift6 를 대응하다보면 바로 하기엔 수정 규모가 너무 크기 때문에 Strict Concurrency Checking 을 우선 minimal 로 두고 워닝을 제거하는 과정을 거치게 됩니다.이때 WebView를 Import 하는 부분에서 워닝이 발생합니다.Add '@preconcurrency' to suppress 'Sendable'-related warnings from module 'WebKit'코드엔 워닝이 없고 다짜고짜 import 에 워닝이라니...이때 제안해주는 대로 @preconcurrency 를 바로 붙이자니 찜찜합니다.다행히 Strict Concurrency Checking을 Complete로 변경하면 문제가 되는 코드를 찾을 수 있습니다. # WKNavigationDelegateWK..
-
[Swift6] @retroactive 를 써야 할까? Extension declares a conformance of imported type ~ 에 대하여Swift 2025. 4. 18. 10:04
Swift6로 올라오면서 extension 해주는 부분에서 아래와 같은 워닝이 발생합니다.Extension declares a conformance of imported type '~A~' to imported protocol '~B~'; this will not behave correctly if the owners of 'Entity' introduce this conformance in the future 이 워닝엔 보통 Fix가 달려있어 자동으로 @retroactive 를 추가해주면 워닝은 해결됩니다.하지만 @unchecked Sendable 같이 뭔가 좀 거부감이 들어 자세히 알아보려고 합니다.Add '@retroactive' to silence this warning @retroactiveSw..
-
RxSwift Single Swift6 대응하기Swift 2025. 4. 11. 18:00
기존에 RxSwift 특히 Single을 사용하던 부분에서 Swift6 대응하며 삽질했던 겪었던 어려움을 남겨봅니다. # 배경먼저 기존 저희 코드에서 Network 통신을 처리하는 부분은 업데이트를 거듭하며completionHandelr, async, rx 3가지 버전이 있었습니다.completion 방식이 제일 기본이고 이를 래핑해서 아래 버전들로 만들어 둔 상태였습니다.- async (swift concurrency)- single (rx) 대강 아래와 같은 형태입니다.// completion handler 방식func get(url: String, completion: @escaping: (response: T?) -> Void {}// Rxfunc get(url: String) -> Single ..
-
[Bash] 패턴 제거, 특정 패턴의 마지막 가져오기Dev 2025. 4. 7. 01:34
커밋 메시지에 브랜치 이름을 prefix로 붙여주는 git hook 을 하나 만들다가 "/" 로 구분되는 문자열 중 마지막 문자를 가져오고 싶은 니즈가 생겼었습니다.따라서 이걸 bash로 어떻게 하는지 간단하게 정리해봅니다. "변수 안의 문자열에서, 가장 앞쪽부터 시작해 /로 끝나는 가장 긴 부분을 제거하고 나머지를 사용한다." 먼저 목표는 위와 같습니다.만약 "feature/9nav"라는 문자열이 있다면, / 기준으로 가장 마지막 슬래시 이후의 문자열인 "9nav" 가져와야 합니다. bash 패턴 제거bash 의 패턴 제거는 ${변수##패턴} 와 같이 사용 합니다.${var#pattern}처음부터 일치하는 가장 짧은 패턴 제거${var##pattern}처음부터 일치하는 가장 긴 패턴 제거${var%..
-
[git] 커밋 메시지에 preifx 붙이기는 git hookDev 2025. 4. 7. 01:22
커밋 메시지에 자동으로 prefix를 붙이는 git hook을 만들어보겠습니다.# 0. git hook 만들기 처음 git hook을 만든다면 기본적으로 아래 3가지 단계를 거쳐야 합니다..git/hooks/ 경로에 파일 생성실행 권한 부여원하는 프리픽스를 넣는 스크립트 작성 실행 권한 부여는 아래 커멘드를 입력합니다. 만약 스크립트 파일 이름을 prepare-commit-msg 라고 지었다고 가정하면 아래 커멘드를 입력하면 됩니다.chmod +x .git/hooks/prepare-commit-msg # 1. 기본 > git hook으로 프리픽스 붙이기"[LOGIN]" 프리픽스를 자동으로 붙이는 git hook을 만들어 보겠습니다.#!/bin/shPREFIX="[LOGIN]"# 커밋 메시지 파일 경로는 ..
-
Swift Seqeunce 이해하기Swift 2025. 3. 27. 14:16
Swift의 Sequence 는 배열의 가장 기본이 되는 프로토콜입니다. 너무 당연하게 사용하고 있지만 정확히 어떤 개념인지 알아보겠습니다.Seqeunce는 Element 에 하나씩 접근할 수 있는 기능을 제공. - makeIterator() 를 제공하거나 IteratorProtocol을 채택하고 next()를 제공해야 함.- for-in, contains 사용 가능- O(n)의 시간복잡도 # 기본 개념protocol SequenceSequence 는 순차적인 일련의 들을 하나씩 반복해서 접근할 수 있는 유형을 뜻합니다.Sequence 프로토콜을 따른다면 for-in 을 사용할 수 있습니다.for-in은 Element에 하나씩 접근하는 가장 기본적인 동작이니 아주 자연스럽습니다.struct Countdo..
-
[Swift] TaskPriority, Task 우선순위 동작 이해하기Swift 2025. 3. 21. 10:40
TaskPriority 는 말 그대로 Task의 우선순위를 뜻합니다. 직관적이고 간단한 개념이지만 Task의 우선순위와 관련한 개념에 대해 조금 더 확실하게 알아보겠습니다. # 기본 개념TaskPriority는 스케줄링 힌트일 뿐, 반드시 이 우선순위에 따라서 실행된다는 보장은 없습니다.@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)public struct TaskPriority : RawRepresentable, Sendable 케이스case high // 사용자 인터페이스 등 즉시 반응이 필요한 작업case userInitiated // 사용자가 명시적으로 시작한 작업, 빠르게 끝나야 함case medium // 일반적인 ..