본문 바로가기

전체 글59

[iOS/Swift] Combine - 시작하기 (Publisher ,Operator, Subscriber) 컴바하아인 Introducing Combine - WWDC19 - Videos - Apple Developer Combine is a unified declarative framework for processing values over time. Learn how it can simplify asynchronous code like networking,... developer.apple.com 컴바인을 사용하는 이유 텍스트 필드에 입력된 값을 다음 vc에 전달하는 코드가 있다고 가정할때, 1. Delegate 패턴 Delegate 패턴은 객체 간의 커뮤니케이션을 위해 인터페이스를 정의하고, 하나의 객체가 다른 객체를 대신해서 작업을 수행하도록 합니다. WelcomeViewController.swift p.. 2024. 4. 17.
[iOS/Swift] Closure의 캡쳐리스트와 ARC + AnyObjet Closure Capture list 이 코드를 실행시키면 어떻게 될까요? “Hello, World!”가 출력됩니다 그러면 이 코드를 실행시키면 어떻게 될까요? “next”가 출력됩니다. 이런 일이 벌어지는 이유가 뭘까요? 바로 capture list때문입니다. Capture List가 뭔데요? 위 코드에서, 함수를 실행시키려면 Str 이라는 변수가 있어야 하는데 str을 (범위 바깥에서도) 지속적으로 사용하고 싶어서 잇는게 Capture 입니다. Closure의 범위 외부에 있지만 Closure의 내부에서 사용해야해 라는 뜻이에요. 즉, 외부에 존재하는 변수를 사용하기위해 사용됩니다. 실제로는 변수를 캡쳐하는일은 잘 없고 보통 객체를 캡쳐해서 사용합니다 self.사용할 객체 이런식으로 사용합니다. 캡쳐.. 2024. 4. 10.
[iOS/SwiftUI] Property Wrapper - 기본편 스유를 시작하면서 사용한 속성들을 정리해보았다. 정리를 시작하면서 든 생각은 엥 사실상 Combine 아니냐 라는 생각이 들었지만 제대로 컴바인과 Rx도 해본적이 없기에.. 일단 전체적으로 정리를 해보고 추후 깊게 하나하나 파볼 생각이다. Property Wrapper @State - 뷰의 상태를 저장하는 속성 스유에서 상태를 처리하는 방법 뷰의 상태를 저장하는 프로퍼티로 상태관리 주체는 해당 뷰 기본적으로 private 선언이기에 다른 뷰와 값을 소통하려면 Binding을 이용 값이 변경될때마다 UI 업데이트 struct ContentView: View { @State private var isPlaying: Bool = false var body: some View Button(isPlaying? ".. 2024. 3. 29.
[iOS/Swift] CGPoint + CGSize = CGRect CGPoint, CGSize, CGRect 이런식으로 빨간색 view를 그린다고 가정했을 때, 필요한 정보들은 View의 위치, View 의 크기 입니다. 좀더 정확하게 말하자면, View의 x ,y 좌표, View의 높이 + 너비 가 됩니다. (Label같이 유동적인 높이 제외) 그리고 종합하자면, 위 CG들은 이것들을 종합하기 위해서 사용됩니다. CGPoint 간단하게 말하면, 그냥 CGPoint는 x, y 라는 변수를 가지고 View의 위치를 나타낼 수 있습니다. 물론 View의 위치뿐만 아니라 x,y 좌표를 사용해야하는 경우에는 어디서든지 사용 가능합니다. CGSize 그리고 마찬가지로 CGSize의 경우에도 width 와 height를 사용 가능합니다. 하지만 실제로 view의 크기를 조정하는 .. 2024. 2. 19.
[회고] GDSC 해커톤 후기 내가 소속한 동아리인 GDSC에서 새해기념 연합 해커톤에 참여하게 되었다. 작년에 참여한 새싹톤의 경우에는 기획부터 서비스 1차 구현,2차구현 등 기간이 한달 이상으로 넉넉하기도 했고 같은 GDSC 사람들이여서 짧은 기간내에 무언가 하나를 뽑아내야하는"해커톤" 이라기 보다 "단기 프로젝트" 느낌이 강했다. 물론 실력있는분들에게 멘토링을 받고 다른 실력있는 기획,디자인,안드,백엔드분들과 정해진 기간동안 하나의 서비스를 만들어 냇다라는것 자체만으로 충분히 의미가 있다고 생각한다. 새싹톤의 경우, 한달이상의 시간이 있었고, 최종결과이후 약간의 나태해짐과 바로 JMT개발 등으로 인해 제대로된 회고를 남기지 못했는데 이번에는 여운을 길게 가져가보고자 회고를 작성해보려 한다. 본격적인 시작에 앞서 사실, 본격적으로.. 2024. 1. 18.
[iOS/Swift] Missing file libarclite_iphoneos.a (Xcode 15)오류 해결 오랜만에 JMT 앱을 켜니 SDK does not contain 'libarclite' at the path '/Applications/~~~~/arc/libarclite_iphonesimulator.a'; try increasing the minimum deployment targeㅇㄹ 이라는 오류가 나오게 되었다. 2.0 버전개발중이라서 서버가 닫혀서 서버측 오류가 낫으면 이해를 하겟는데... 빌드조차 되지않는 오류가 발생한것은 굉장히 당황스러운 일이였습니다. 생각을 떠올려보니 이전에 공부하던 SwiftUI에서 오류가 나길래 Xcode15로 버전을 올렷고... 제 맥북을 Ventura에서 Sonoma로 업그레이드를 햇고....등의 일들이 생각나게 되었습니다. 이를 바탕으로한 오류인듯 하여 방법을 찾았.. 2024. 1. 11.
[iOS/SwiftUI] LunchScreen 적용하기 UIkit 에는 main 스토리보드와 더불어,항상 같이 딸려왓고 기본으로 세팅되는 LaunchScreen 이 SwiftUI에는 없었습니다. 찾아보니 스유에서는 기본적으로 런치스크린을 Info.plist 에서 관리하는것을 알았고 UIkit처럼 런치스크린을 스토리보드에서 관리하는 방법도 만들 수 있었습니다! 1. Info.plist 으로 설정하는 방법 파일의 최상단 부분에 프로젝트를 선택 후 Target > Info 으로 들어가서 Key 부분에 아래 Launch Screen을 추가해준다. 이때 Value에 적혀있는 LaunchScreenBackgroundColor 등의 이름들은 Assets에 저장한 이름대로 작성해주면 됩니다. 2. 스토리 보드 추가하기 Cmd + n 으로 LaunchScreen 추가하기 스.. 2023. 12. 31.
[iOS/Swift] 앱스토어 배포와 리젝일기 JMTeng 앱을 드디어 배포를 하게 되었습니다. 배포를 하기 위해서는 앱 아이콘, 아카이브, 앱 바이너리 파일 업로드 등의 절차를 거쳐야 하지만 이전에 Testflight를 통해서 최종 제출을 제외한 나머지를 진행했었기에 생략하겟습니다. 앱스토어에 올라갈 목업 이미지를 뽑아줍니다. ipad를 선택하지 않은 경우에는 굳이 아이패드 사이즈를 지정하지 않아도 문제없지만 정해진 규격만 지켜주시면 문제되지 않습니다. 이따금 사진을 올렷는데 x표시가 뜨면서 사진이 올라가지 않았다고 뜨는 경우가 있는데 사진을 다시 올려주면 해결됩니다 프로모션 텍스트 목업 이미지 아래에 들어갈 처음에 보이는 간단한 설명이고 자세한 설명은 (더보기) 로 작성될 설명 텍스트에 상세한 기능들에 대해서 작성하면 됩니다. 이후 저작권과 사용.. 2023. 10. 29.
[iOS/Swift] 앱스토어 게임 탭 따라하기 (Composition Layout) 구현하려는 view Compositional layout 각 필요한 Cell들을 Nib 파일로 묶어서 작성했습니다. import UIKit final class ExtraLargeAppCell: UICollectionViewCell { @IBOutlet private var captionLabel: UILabel! @IBOutlet private var titleLabel: UILabel! @IBOutlet private var subtitleLabel: UILabel! @IBOutlet private var thumbnailView: UIView! override func awakeFromNib() { super.awakeFromNib() thumbnailView.layer.cornerRadius = .. 2023. 10. 1.