.gitignore에 실컷 APIInfo.swift를 적어둔줄 알고 확인해봤더니 APIKey.swift로 적고 작업을 이어했었다..땀이 삐질삐질 나는 상황 여러 정보들을 찾아보고 한줄기 빛을 발견해 해결했다! 이것저것 해보다가 기록을 확인해봤는데 여전히 남아있는 상황..알고보니 해당 파일의 정보를 삭제할때 경로가 올바르지 않아서 삭제가 되지 않았던 것 같다. 아래 코드를 해당 깃 폴더에 입력하면 확인 가능하다.git log --follow -- [파일명.확장자] 확인했으니 차근차근 입력해보자!git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch [경로/파일명.확장자]' --prune-empty --tag-name-filter..
Custom Font는 폴더에 다운 받은 후, 위의 사진처럼 UIKit에서 Font를 추가했던 것 처럼 Info.plist에 추가해주면 된다. 그리고 font family에서 실제로 어떤 이름으로 폰트가 사용되는지 안 후, 해당 텍스트를 적용해주면 된다.for family: String in UIFont.familyNames { print(family) for names : String in UIFont.fontNames(forFamilyName: family){ print("=== \(names)") }}Text("CamDa") .font(.custom("UhBeemysenBold", size: 100)) 근데 매번 이렇게 폰트를 적용할 수도 없고 .font형식으로 불..
TamagochiView에는 @ObservedObject를 사용한 viewModel이 있다.struct TamagochiView2: View { //@Published로 선언된 데이터가 변경될 때의 신호를 받는다. @ObservedObject private var viewModel = TamagochiViewModel() var body: some View { VStack { Text("밥알: \(viewModel.rice)개, 물방울 \(viewModel.water)개") HStack { TextField("밥알을 입력해주세요", text: $viewModel.riceFie..
LSLP를 구현하면서 Compositional Layout에 Header를 추가해보았다.기존의 CompositionalLayout을 구현해주는 함수에 header의 사이즈를 추가해준다.let headerSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .estimated(100))let header = NSCollectionLayoutBoundarySupplementaryItem(layoutSize: headerSize, elementKind: UICollectionView.elementKindSecti..
텍스트의 길이에 따라 가변적으로 변하는 collectionViewCell을 적용하고 싶어 CompositionalLayout을 적용해 보았다.CompositionalLayout을 사용하기 전에 구현했던 방법은, 이러했다. ShoppingListViewController output.searchItems .asDriver(onErrorJustReturn: []) .drive(collectionView.rx.items(cellIdentifier: SearchItemCollectionViewCell.identifier, cellType: SearchItemCollectionViewCell.self)){ row, element, cell in cell.titleLabel.text = el..
ReactiveX An API for asynchronous programming with observable streamsasynchronous programmingRx가 얘기하는 비동기 프로그래밍이란?앱의 전체적인 사용관점에서 비동기라고 한다.→ 코드의 실행 순서가 정해져있지 않다.→ 사용자의 입력 등 다양한 외부적인 요인에 따라서 코드는 다르게 실행 될 수 밖에 없음: Line by line 으로 실행되는 것이 불가능하다.Rx에서는 아래의 기능들을 포함하여 비동기 프로그래밍이라고 한다.Event - Touch Up InsideClosureGCDDelegate PatternNotification CenterObservable Streams(Observable Sequence)Observable, Ob..
iOS 13이하에는 인덱스 기반으로 CollectionView와 TableView를 다루었다면, iOS 13 이상부터는 레이아웃과 데이터기반으로 구성할 수 있는 방법이 등장하였다. 1. 레이아웃 만들기let collectionView = UICollectionView(frame: .zero, collectionViewLayout: createLayout())private func createLayout() -> UICollectionViewLayout { var configuration = UICollectionLayoutListConfiguration(appearance: .plain) configuration.backgroundColor = .clear return UICollecti..
왜 사용할까?Debug / Release 최적화 기술swift/docs/OptimizationTips.rst at main · swiftlang/swiftswift는 기본적으로 각 파일을 개별적으로 컴파일한다.그래서 WMO(Whole module optimization)은 서로 엮여져 있는 파일들을 하나의 파일처럼 실행한다.컴파일 시간은 오래걸릴 수 있지만 컴파일 되고 나서는 실행 자체는 빨라질 수 있다. Dynamic Dispatch / Static Dispatch런타임 시점에 확정(Dynamic) 컴파일 시점에 확정(Static Dispatch)Dynamic Dispatch: classStatic Dispatch: struct, enum클래스 안에 있는 메서드는 dynamic Dispatch로 동작하..
1. 작은 크기에서 크게 커지는 애니메이션정해진 위치에서 커지는 것이라 레이아웃은 변경하지 않음//크기를 10분의 1로 줄임logoImageView.transform = CGAffineTransform(scaleX: 0.1, y: 0.1) 1-1) 회전하면서 원상태로 만들기 UIView.animate(withDuration: 0.5, delay: 1, options: .curveEaseIn){ self.logoImageView.transform = CGAffineTransform(rotationAngle: 180)} completion: { _ in self.animationEmailTextField()} 1-2) 원상태로 크기 만들기UIView.animate(withDuration: 0.5..