UIKit을 처음 배워서 Button과 Action이 1:1 매칭인줄 알기도 했고, 피곤해서 대충 짠 코드를 보고,, 과오를 뉘우치기 위해서 코드를 이쁘게 만들어 보았음.sender가 무엇인지 배우고, Button과 Action이 1:1이 아니라는 사실을 알고나서 두뇌
User Interaction Enabled를 체크하면 됨
Swift에서 문자열 안에 "나 /같은 특수기호를 출력하고 싶으면 그 앞에 /를 넣어야만 했다. 예를 들면 이렇다.백준의 고양이 문제나 개 문제를 보면, 대충 보면 그대로 print하면 될것 같지만, 잘 안되는것처럼, 지금 이순간에도 많은 개발자들에게 고통을 주고있는건
UIButton에 이미지를 넣었더니 자동으로 re-sizing이 되지 않고 원본 그대로 들어가버리는 현상 발생background를 custom으로 변경 후backgrond - Image에 넣어주면 굉장히 잘됨
앱의 생명주기 1. Not Running 실행되기 전, 추후 설명할 백그라운드에서 Suspend된 상태에서 메모리가 해제되면 Not Running으로 돌아간다. 업로드중.. 2. Active <img src="https://velog.velcdn.com/images
Swift 5.7에서 추가된 구문기존에는이렇게 age = age를 사용하여 중복되는감이 없지 않아 있었는데,이렇게 사용하여 조금 더 짧게 사용할 수 있게 바뀌었다.
NavigationBarButton에 Action을 추가하다가 별로 만나고 싶지 않은 @objc라는 단어를 보고야 말았다. 그래서 Selcetor는 무엇인지, @objc는 왜 붙이는지에 대해 알아보고자 포스팅을 작성한다. 특정 메서드를 컴파일할 때 동적으로 식별하고 참
200 x 200 의 정사각형이 있다고 했을때 radius 50을 주게 된다면,각 양쪽부터 50까지의 거리를 계산하고 나서, 모서리를 둥글게 만들고 나머지를 삭제해버린다.같은 원리로 만약 Swift에서 원을 만들고 싶다면 크기의 절반을 radius로 지정하면 원을 얻을
SwiftUI는 State, Binding, ObservableObject등의 값이 변경될때마다 뷰가 리프레시 되는데, UIKit이나 objc에선 어떻게 리프레시 되는지 몰라서 한번 찾아보았음.iOS Drawing Concepts(https://develope
두줄 요약UITableView -> indexPath.rowUICollectionView -> indexPath.itemUITableView를 공부하다가 .row와 .item을 발견했는데, 둘다 써도 정상적으로 작동되길래 의아해서 한번 찾아봄.UITableView의 경
어떤 한 클래스를 마치 부모(슈퍼) 클래스나, 자식 클래스 '처럼' 사용하게 만드는 방식이다.예시를 보자면,이런식으로 하면, testApple은 Apple클래스이지만, test는 Mobile로 타입캐스팅을 해서 Mobile클래스를 가진 친구가 되어버림. 업캐스팅 ( -
Interface Builder의 아카이브 및 nib파일이 로드 된 후 호출되는 메서드, IB가 전부 아카이브 되어있기에 outlet과 action의 연결을 보장함.awakeFromNib은 init과 loadView사이에 실행되게됨.G선생님에 의하면..UITableVi
frame은 본인 뷰의 크기, bounds는 기기의 크기라고 알고 있었음.The frame rectangle, which describes the view’s location and size in its superview’s coordinate system.The bo
Any는 모든 타입과 구조체, 클로저, 클래스, 열거형 등 모든 인스턴스를 담을 수 있다.AnyObject는 오직 클래스타입의 인스턴스만 담을 수 있음.Class나 구조체 등 생성하고 난 뒤에 생성된 객체를 인스턴스 라고함. 아래의 mcflurry가 인스턴스임.Clas
커맨드로 가끔 공식 코드를 뜯어보곤 하는데, 그럴때마다 간헐적으로 @MainActor라는 키워드를 볼 수 있다. 이게 무엇인지 궁금해서 찾아봄.swift concurrency와 관련되어있다. iOS에서 UI업데이트 관련 작업은 전부 메인 스레드에서 실행이 되어야만 한다
함수의 종류를 크게 3가지로 나눌 수 있다.instance functionstatic functionclass function각각 코드로 나타내면 다음과 같다.instance function은 흔히 많이 쓰는 function인데, 인스턴스 메서드, 프로퍼티 처럼 인스턴
수치 조절해가면서 삽질해봤는데, 아이폰 15프로 기준 딱 화면 정 가운데에 잘 보인다.
iOS에서 앱 구동시 필요한 파일들을 저장해 놓는 구조로써, 임의적으로 유저들이 접근할 수 없다. 그 이유는 이 파일들이 어디에 저장되는지 애플만 알고 있고, 개발자들은 Xcode를 통해서 설치한 앱에 한정하여 파일의 구조를 다운받아 볼 수 있다. 만약 경로를 알아내더
SubScript를 공부하고나서 어떻게 활용해볼까 고민해보다가 UserDefaults에 활용하면 좋지 않을까 해서 한번 구성해봤음. UserDefaults가 사용하기 어려운건 아무래도 key를 개발자가 직접 String으로 넣어줘야 한다는것과 벨류를 뽑아낼때 strin
사용자를 귀찮게 하는 이상한 취미를 가진 개발자들이 많은데, 이떄 딱 좋은 기능이 푸시 노티피케이션이겠다. 흔히 사람들이 푸시알림이라고 부르는것들을 이 글에서 구현해 볼 수 있도록 하겠다.푸시 노티는 다른 하드웨어 설정(카메라, GPS등)과는 다르게 info.pilis
SubScript... 이름만 들어도 무시무시 하지 않은가? 필자는 처음 서브스크립트라는 단어를 듣고 솔직히 공부하지 않았다. 이름만 들어도 무엇인가 굉장히 고-급져보이고 Swift 걸음마 떼는 수준의 사람에겐 가당치 않아보이는 문법이였기 때문이다. 최근 다시 문법을
다음과 같이 위치 정보에 관한 enum을 만들어보면, 아래와 같은 경고를 만날 수 있다.Switch covers known cases, but 'CLAuthorizationStatus' may have additional unknown values, possibly a
썸네일의 처참한 그림실력을 보고 뒤로가기 버튼을 누르지 말고, 일단 제 이야기를 한번 들어주세요. ㅋㅋㅋㅋ.... 0. 서론 테이블뷰를 사용할때, 500개의 셀을 쭉 이어본다고 생각해보면, 다음의 사진과 같은 형식이 될 것이다. 만약 그렇다면 뷰를 보여주기 위해 50
iOS watchOS 실시간으로 데이터를 연동해보려고 이것저것해보다가 CloudKit을 연결하면 빠르면 바로, 늦어도 30초 이내 정도로 데이터가 연동될 수 있다. 업로드중..
\[알쓸신잡] iPad에서 똑같은 앱을 동시에 실행하고 있을때, 참조 메모리를 공유할까?의 2편임.전제는 같은 앱을 아이패드에서 동시에 켰을때임.StateObject, State는 같은 메모리주소를 가지지 않아서 데이터를 공유하지 않았음.그러나 ObservedObjec
\[iOS] UserDefaults와 SubScript의 운명적 만남의 후속편임.리팩토링하기 싫어서 빈둥거리다가 리팩토링 과제가 주어져서 생각난김에 게시물에서 제시해본 대로 리팩토링을 한번 해보았음.의도한대로 매우 잘 작동한다 굿굿
lazy는 지연 저장을 위한 키워드로서, 최초로 변수 등에 엑세스 할때 생성되게끔 한다. 추후 강하게 계속 값을 가지고 있어야한다.weak는 약한 참조를 위한 키워드로서, 대상이 강하게 참조하지 않으면 자동으로 nil로 만들어버려서 순환 참조를 방지하는 키워드이다.따라
URLSession을 배우고 구글의 잼민이(Gemini) AI로 어떤 이상한짓을 해볼까 하다가 Xcode Extension이 재밌어보여서 이것저것 시작해보았음.그래서 만들어놓고 실행을 했는데, 아무리 찾아봐도 테스트로 넣어둔 기능들을 찾지 못해서 헤매고 있었음.Exte
1. ARC란 무엇인지 설명하시오. > Automatic Reference Counting 이름에도 유추할수 있듯 자동으로 레퍼런스(참조)를 카운팅 해주겠다 2. Retain Count 방식에 대해 설명하시오. 3. Strong 과 Weak 참조 방식에 대해 설명
SwiftData같은 DB 프레임 워크는 데이터가 변경되면 뷰도 알아서 변경되는데, Realm은 그렇지 않다. 데이터가 변경 되어도 tableView.reloadData()같은 녀석들은 알아서 호출을 해주어야 하는데, viewWillApper()같은 메서드에 넣어주기에
\[iOS] 연구해본 Database Event-Driven Reloading View의 후속편잠들려고 누웠다가 문득, didSet을 잘 활용하면 데이터를 변경하는 지점에 개발자가 직접 넣어주지 않더라도 알아서 함수가 실행되게 할 수 있지 않을까? 라는 생각에 아침에
\[iOS] frame과 bounds의 차이frame: 상위뷰의 기준에서 뷰의 위치와 사이즈를 나타냄.bounds: 자신의 기준에서 뷰의 위치와 사이즈를 나타냄GPS, 가속도 등 디바이스의 센서 사용 불가카메라, 마이크 등 디바이스의 모듈 사용 불가AppleWatch
제목을 거창하게 적었지만,, 사실 아직 구현을 하지 못했기에 적을것이 없음. Realm Cloudkit, Realm data sync 등 검색하면 나오는 거의 모든 게시물을 본거같은데, 죄다 옛날자료에 잘 안되는것들만 나와있음.그러나 지금까지 찾은 실마리를 적어보자면,
ARC를 이해하고나서 weak와 unowned를 아무리 생각해도 이해할 수 없었는데, 드디어 오늘 이해하여 게시물로 생각을 다시 한번 정리해 보았음.weak와 unowned가 RC를 올려주지 않는다는건 알고 있었음. 근데, 변수로 담으면 사용할 수 있으니까 RC를 올려
살면서 한번정도는 본 화면일텐데, 이 서비스의 경우 우편번호 서비스는 무료이고, 사용량 무제한, 키발급을 안해도 되는 엄청난 서비스이다.그러나 이게 api형식도 아닌지라 iOS에서 사용하려면 웹에 호스팅을 한 후 웹뷰로 띄워야 한다.깃허브에서 정적인 웹사이트를 쉽게 호
UIApplication이고, 앱의 Life Cycle을 관리하게 된다. 싱글톤으로 구성되어있고, shared로 접근할 수 있다. UIWindow를 관리한다.UIApplicationDelegate를 이용하여 다음과 같은 Action을 제어할 수 있다.임시로 터치 이벤트
iOS단톡방에서 재미있는 주제로 이야기를 하는걸 보았음. 값타입의 CoW에 대해 알고는 있었는데, 단 한번도 아래 사진과 같은 의문은 가져본적이 없었고, 실험 결과가 너무 재미있어서 한번 정리해보았음.기존에 알고 있던 CoW는
Class 안에 여러 Class의 인스턴스를 넣은 것과, Struct 안에 여러 Class의 인스턴스를 넣었다. 어떤 것이 생성되는 속도가 더 빠를까?ClassInClass: 27.148070096969604 StructInClass: 26.98146617412567S
[iOS] Struct와 Class의 한판승부 - 1의 후속편 0. 실험 코드 1. 설명 CFGetRetainCount는 ARC의 참조 횟수를 리턴해주는 함수이고, Class in Class와 Struct in Class일때 어떤 결과가 나오는지 실험. 2. 결과
[iOS] 배열의 Copy-On-Write - 1의 후속편 0. 실마리를 찾았음. 어제까지만 해도 arr의 예약된 크기가 선언될때 3개를 넣었다면 10개씩 할당되는 줄 알고 있었음. 그러나, 배열에 capacity라는 프로퍼티가 있다는걸 알게 되고 어제의 의문이 전
0. 서론 서버의 이미지를 받아오는 과정에서 Request를 하려면 KingFisher Request에 Header를 넣어줘야 했음. 그러나, AccessToken같은걸 관리하는 과정에서 어떤식으로 하면 좋을지에 대한 고민. 1. 일단 헤더 셋팅 함수 만들기 헤더에 포함 되어야 하는 내용은 엑세스토큰, API Key, contentType이다. 나중에 어...
[iOS] ObservedObject, 그는 신인가?의 후속작임. 0. 서론 이전 게시물에 결론을 열심히 적었지만, 사실 이해가 하나도 되어있지 않은 상태였다. 그러다가 오늘 Custom App Delegate와 Custom Scene Delegate를 만들고나서 드
개발 속도를 빠르게 함에 있어서 가장 중요한건 실수를 줄이는것 일것이다. 애플도 그걸 잘 알고있는지, Swift5에 새로운 에러 처리 방법을 소개하였다.URLSession등으로 데이터를 받을때, request 클로저 내부에 return문을 사용할 순 없으므로 보통 Co
이런 뷰를 만들고, ContentView를 실행하면 init은 어떻게 될까..? 상식적으로 생각했을때는, NavigationLink안에 들어있는 뷰를 들어가는거고, 사용자의 눈에서도 눌러야 나오는것처럼 보이니, init이 전혀 실행이 안될것 같아야 정상적일 것이다. 0
구조체는 기본적으로 내부에서 값을 변경할 수 없다. Struct로 뷰를 그리는 SwiftUI특성상 원칙대로로는 뷰에서 값을 변경할 수 없다는 의미이다.mutating 키워드를 이용하면 되지 않냐 싶지만, 이마저도 어림도 없다.왜 구조체에선 값을 변경할 수 없을까?cla
0. 서론 중학교 때부터 코딩을 해오다보니, Xcode에서 여러 디버깅툴을 제공해주어도 여전히 나는 아직도 print가 더 편하고 익숙하다. 그럼에도 신식 개발자가 되려면 Xcode에서 여러 디버깅툴들을 제공해주니, 한번 정리를 하는 편이 좋을 것 같아 정리해봄. 1. BreakPoint 나를 포함해서 초보 개발자들을 여럿 울린 브레이크포인트이다. 실...
0. 서론 watchOS라던가, Widget같은 녀석들은 iOS 어플이 있어야만 만들 수 있도록 의존이 되어있고 (워치는 단독이 되긴 하지만), 사람들은 설치할땐 똑같은 앱을 설치한 것 처럼 보이지만, 실상은 그렇지 않다. Xcode에서는 사실상 다른 앱 취급을 받
전편 : \[iOS] AppGroup을 켜면 어디까지 공유가 될까? - 1일단 기본적으로, FileManager에 대한 이해가 있어야 함. FileManger에는 다음과 같은 메서드가 있다..containerURL(forSecurityApplicationGroupIde
기존에 사용하던 토스트UI 라이브러리는 사용하기는 편했으나, 커스텀을 하거나 SwiftUI환경에서 사용하기 어려웠다. 라이브러리 자체가 UIView에 뷰를 추가하는 방식이였기 때문이다.요즘같은 UIKit과 SwiftUI를 쓰까쓰는 시대에서 새로운 라이브러리가 나왔으면
0. 서론 서버에서 받아오는 값과, 실제로 사용할 값의 타입이나 값들을 수정하고 싶을때, ViewModel에서 변환시키거나 하는 경우가 대부분 일 것이다. 하지만 더욱 더 일관되게 Model을 사용하고 싶을 때 DTO Model을 사용할 수 있을 것이다. 그러나 어떤
0. 서론 이런 듣도보다 못한 뷰 파일을 본 적이 있는가? 대부분의 SwiftUI의 뷰는 Computed Property를 이용하여 만드는데, 저런식으로 만드는건 상상조차 못했을 일이다. 하지만 body조차 프로퍼티이기 때문에, 안될 일이 무엇이 있겠는가. 오늘은
Jercy's Interview Questions for iOS Developers의 질문 중 하나.Central과 Peripheral의 역할과 상호작용 과정을 설명해주세요.CBCentralManager와 CBPeripheralManager의 주요 메서드와 델리게이트
Bluetooth에 대한 무지에서 시작된 공부, 사실 Bluetooth의 경우 특별히 모듈이나 장치를 만들지 않으면 경험해보긴 쉽진 않기에, 근처의 주변기기를 탐색하고 연결정도 해보는 BluetoothManager를 구현해볼 예정이다.사실 아두이노를 갖고 있고 어케 만
iOS 프로젝트를 처음 만들게 되면 맨 처음으로 하게 되는 고민이 있다. 바로, 최소 버전을 몇으로 할 것인가? 라는 고민이다. 나는 그 고민을 해결하기 위해 iOS개발자로서 지하철을 탈때마다 사람들의 아이폰이 어떤 기종인지 많이 살펴보곤 한다. (사람들이 어떤 버전을
이전 포스팅에서 나는 iOS 15까지 대응하는것이 적절하다고 결론을 지을 수 있었다. SwiftUI를 기준으로, iOS 15부터 현재까지 가장 버전 대응을 해야 하는건 많지만, 가장 눈에 뛰는건 한 가지가 있다고 생각한다. 바로 Navigation이다.Navigatio
회사에서 Unity를 연동할일이 있어 오늘 눈물 콧물 쏙 빼고 왔다. 이 경험들을 잊기전에 했었던 내용들을 정리해서 Velog에 정리해보고자 한다.처음에 Unity를 얹는다고 하시길래 당연히 Unity로 만든 모델 파일을 얹는건줄 알았는데, 아니였음 ㅋㅋㅋㅋㅋ 나는 U
회사에서 혼자, 처음으로, 첫 프로젝트를 맡게 되었다. 그리하여 iOS 최소버전, 기술스택, 아키텍쳐까지 내 마음대로 정할 수 있었다.iOS에서 기술스택이라 하면 가장 큰건 UIKit, SwiftUI 일 것이다. 새싹을 진행하며 UIKit을 단련하긴 했지만, 우리 회사
0. 서론 저번 게시물에서 다양한 아키텍쳐의 종류와 나의 생각들, 그리고 회사 프로젝트는 MVI 아키텍쳐로 정했다. 이번 게시물에선 MVI가 무엇인지, iOS 프로젝트에선 MVI를 어떻게 적용시킬 수 있는지에 대해 서술해보도록 하겠다. 1. MVI가 뭔데? MVI
회사에서 Combine을 쓰면 딱 좋겠다 싶어 Combine을 도입했다. 사실 콤바인은 잘 몰라서 GPT한테 RxSwift에서 \~~이런거는 Combine에서는 뭐냐?라고 물어보며 사용하고 있다.사용하는 도중에 개인적으로 코드에서 weak self를 보는걸을 굉장히 싫
그냥 느낌 가는대로 만들고 싶은 앱을 만들고 있다. 지금 만들고 있는 앱은 고양이를 보면서 힐링하는 앱이다.지금까지 사진을 그렇게 막 다뤄볼 일은 없었어서 핀터레스트 UI같은걸 잘 구현해볼일이 없었는데, 마침 사진이 도메인인점, 그리고 고양이를 더블로 보면 더 귀엽다는
인간시대의 끝이 도래했다Skip이라는 이상한 툴이 나왔다. Swift로 만들어진 앱을 Kotlin으로 변환시켜 빌드하게 해주는 툴이다. 즉, Swift로 네이티브 앱을 만들고 해당 프로그램을 작동시키면 Kotlin으로 네이티브 앱을 만들어주는 것이다. Skip 공식 홈
0. 서론 스유에서 뷰를 자를때 clipShape를 자주 사용했었다. 사실 그거밖에 몰랐었다. 그러다가 문제가 생겼는데, SignInWithAppleButton, 이녀석 때문에 골머리를 앓았다. 애플 로그인은 상당히 까다롭다. Sign in with Apple | Apple Developer Decumentation을 확인해보면 뭔가 주저리주저리 말이 ...
우리 회사 앱을 쓰다가 짜증나고야 말았다. 필자는 꽤 고집이 쌔서 다음 사항 중 하나라도 지켜지지 않은 앱은 전부 삭제해버린다. 그 항목들이 뭐냐면..(중요)백버튼 커스텀해서 Swipe to dismiss를 막아놓거나 어줍짢게 구현해서 사용에 불편을 느끼게 하는 앱백그
Firebase 10에서 Firebase 11로 올렸는데 여기서 에러 생긴사람 나야나
0. 서론 SwiftUI는 특성상 { } 가 많아질 수 밖에 없다. 대부분의 선언형 프레임워크들이 그렇듯, 어쩔 수 없는듯 하다. 나는 이전부터 이것들이 너무 거슬렸었다. { } 들이 중첩되면 가독성이 매우 안좋아질 뿐더러 기분이 매우 언짢아진다. 내 기분을 위해서
싸늘하다. 가슴에 비수가 날아와 꽃힌다.하지만 걱정하지 마라. 리젝은 무엇보다 빠르니까.아귀한텐 밑에서 한 장. 정마담도 밑에서 한 장. 나 한 장. 아귀한텐 다시 밑에서 한 장. 이제 정마담에게, 마지막 리젝.이번 리젝 사유는 '회원 탈퇴 기능이 없다' 라는 이유로
오늘의 리젝은 뭘까~~요?우리 회사 앱은 블루투스를 이용해서 외부 장치와 연동하는 앱인데, 리뷰어 입장에서 이걸 테스트 해볼 수 없으니 영상을 찍어 보내달라는 이야기. 영상을 찍어보내면 바로 해결이 된다.
내가 별로 안좋아하던게 몇몇개 있었다. 그 중 하나가 Test 코드이고, 또 다른걸로는 Logger가 있다.최근들어 만들고 버리는 프로젝트가 아닌, 앞으로 계속 책임져야할 프로젝트를 맡게 되니 생각이 좀 달라졌다. 생각이 좀 짧았다는 생각도 많이 들었다.오늘은 그 중
어찌보면 이 포스팅의 후속편이라고 볼 수 있겠다.내가 이번 회사 앱을 만들면서 못해도 딱 이거 하나만큼은 지키기로 했었다. 버그는 있어도 크래시로 앱이 꺼지는 일은 절대 없도록 하자라고 다짐했었다.앱이 강제로 꺼지는 일은 보통 ! 옵셔널 강제 해제, index out
배열을 Index로 접근하는 방식은 성능상에 있어 엄청난 이점을 준다. 약 0.2 ~ 0.3초마다 계속 뷰가 빠르게 Refresh되어야 하는 우리 회사 앱에서 성능을 위해 배열에 Index 접근을 더 적극적이고 과감하게 쓸 수 밖에 없었다.배열을 과감하게 다루고 그러다
KWDC에서 보다가 눈이 띠용하는 연사를 하나 찾아보았다. 핀테크 어쩌구저쩌구 친절한 에러 뭐시기 제목이였던거 같은데, 다른 연사 보고 아직 하고 계시길레 마지막에 한 1-2분 듣다가 우와 했었음. 자세한 내용을 못들어서 어케 구현했는지 알 수 없었으나, 마지막장의 구
회사에서 출근하자마자 어제까지 잘 빌드되던 코드가 갑자기 빌드가 안되었음.여기서 문제를 찾으면 고수 인정. 해당 코드에서 오류를 찾아보시오..............문제는 없다. 아니 안보인다.아둔 토리다스...다른 메모앱을 사용하여 저 코드의 문제를 알 수 있었다.그대