XCTest란?Xcode 프로젝트에 대한 단위 테스트, 성능 테스트, UI 테스트 등을 만들고 실행하는 프레임워크The pyramid model approach to testing helps to strike a balance between thoroughness, quality and execution speed.WWDC에서 위 피라미드 모델을 참고하면 철저함, 품질 및 실행 속도 간의 균형을 맞추는 데 도움이 된다고 함User interface - 사용자에게 가까운 영역. 뷰 단위Integration - 통합 테스트Unit - 코드의 양이 많아진다. 로직 단위 Test와 내 앱이 다른 타겟이기 때문에 @testable import MyApp 이 필요하다🤔 그냥 import MyApp 만 하면 안되는..
iOS13+ 사용가능과거엔 Today Extension 으로 존재했다. (iOS 12까지만 사용가능) - 새롭게 추가 X , 엑스코드에서 사라짐 업데이트 기능iOS 16 → 잠금화면에 추가 가능iOS 17 → MacDesktop, iPad잠금화면, StandBy, Watch Smart Stack ... containerBackground(.fill.tertiary, for: .widget) : 잠금화면에서 위젯 띄울 때 컬러 자연스럽게 변화되는 기능 위젯 특징업데이트 주기가 불명확하다. 하루에 업데이트 40~70번 제한 (1시간마다 업데이트하겠다고 선택해도 대략 한 시간임)데이터 변화 시 강제로 위젯을 업데이트하는 방법이 존재하긴 함(아래 참고)메모리 제한. 30MB.syste..
사진을 메인으로하는 SNS 앱을 만들다가 이미지가 메모리를 너무 많이 차지해서 앱이 죽는 문제가 발생했다❗️ 우선 알아야 할 점 메모리가 이미지의 파일의 크기로 계산되는 것이 아니라 이미지의 해상도 (크기)로 계산이 된다는 점이다.이미지를 서버에 올릴 때 압축해서 5MB 이하 크기로 만들었기 때문에 메모리도 적게 먹는 거 아냐? 했지만 해상도는 줄어들지 않았기 때문에 메모리를 매우매우 많이 차지하고 있었다,,, UIGraphicsBeginImageContext 와 UIGraphicsImageRenderer 두가지 방법이 존재하던데 신식 방법인 UIGraphicsImageRenderer를 사용했다UIGraphicsimagerendererextension UIImage { func resize(ne..
some역제네릭타입, opaqueType, 불투명한 타입✅ 역제네릭 타입구현할 당시에 타입을 안다✅ 제네릭: 타입 파라미터구현할 당시에는 타입을 모른다사용할 때(함수 호출과 같은) 타입이 구체적으로 지정.var body: Text { get { Text("") }}SwiftUI에서 body는 연산프로퍼티 (get이 생략되어 있는 형태이다.)연산프로퍼티는 항상 타입을 명시해줘야한다.하지만 boby 안에 항상 Text 타입만 존재하진 않을 것이다.var body: Text { //❗️타입 오류 발생 HStack { }} 이렇게 내부가 바뀔때마다 바뀐 타입을 명시해줘야하는데 쉽지 않다...var body: some View { HStack { ..
Realm Schema 수정 및 Migration 영양제를 기존에 있는 영양제와 중복되는 이름으로 저장 시, 영양제 복용 여부 테이블에서 데이터 분별력이 떨어지는 이슈가 있었습니다. 해결1. 같은 이름의 영양제는 추가 되는 것을 막기 해결2. 영양제 PK를 영양제 복용 여부 테이블에 FK로 저장하기 중에 2번 방법을 선택하여 FK 컬럼을 추가했습니다. 새로운 컬럼을 추가하면서 기존에 들어있던 데이터에도 적절한 FK를 추가해주기위해 FK가 기본값이라면 '해당 이름이 영양제목록 테이블에 존재하면서 && 해당 supplementTime을 가지고 있는 영양제가 있다면' 그것에 해당하는 영양제의 PK를 넣어줬습니다. final class RealmSupplementLog: Object { @Persisted(pr..
영양제 전체 목록 테이블과, 복용 여부 테이블이 나뉘어져 있는데 사용자가 영양제를 삭제하면 복용 여부 테이블에는 남아있는데 영양제 실체는 사라져서 ‘-1개 남았어요’ 이런 식으로 나타는 오류가 있었습니다. 그렇다고 영양제 복용 여부에서도 삭제해버리면 과거에 먹었던 것도 기록이 사라지는 문제가 있었습니다. ✅ 영양제목록 테이블에 기본값이 nil인 deleteDate컬럼을 추가해서 사용자가 삭제하면 현재 Date 값을 update 해주었습니다. 사용자가 캘린더 날짜를 클릭해서 그 날 먹어야했던 영양제를 조회할 때 영양제의 deleteDate 선택한 날 > regDate 이면 영양제가 있다고 처리했습니다. final class RealmSupplement: Object { @Persisted(primaryKe..
Local Notification 에 Identifier 가 64개로 제한되어 있다는 사실을 아시나요... 복용하는 영양제를 저장해서 해당 시간에 알림을 받아볼 수 있는 앱을 제작중에 겪은 문제를 공유하고자합니다ㅏ 우선, 제 앱 기획상 하나의 영양제를 7주일, 하루에 3회까지 복용할 수 있어요 그래서 하나의 영양제만 먹는다고 하더라도 7*3 = 21... 최대 21개의 identifier를 써버릴 수 있는 문제가 있었어요 그렇다고 모든 알림을 하나의 identifier로 처리해버리면 12시에 먹는 영양제를 아직 못먹었는데도 12시1분에 먹어야 할 영양제 알림이 울리면 알림이 덮어씌워진다는 아쉬움이 있었습니다... 그래서 제가 떠오른 방법은 같은 요일 같은 시간에 울리는 알림은 하나로 처리하자! 였습니다 ..
기본적으로 Swift는 각각의 파일들을 개별적으로 컴파일한다.MyViewController - MyView - CustomLabel처럼 서로 상호작용을 하고 있는 것들의 연관관계를 파악해서 마치 전체 프로그램을 하나의 파일인 것처럼 컴파일을 하게 된다면 최적화할 수 있을 것이다.⇒ 전체모듈최적화 WMO(whole module optimizations) 이렇게 하게 된다면 컴파일은 오래 걸릴 수 있지만 사용자가 실행할 때는 더 빠르게 실행 가능하다. 🤔전체모듈최적화를 더 향상 시키는 방법이 있을까? → 접근제어를 잘 활용해주기 접근 제어를 잘 활용하기 위해 접근 레벨에 대해 알아보자AccessLevel 접근레벨open - 다른 모듈 public - 다른 모듈internal - 기본값 - 모듈 ..