
기본코드class ContainerTest extends StatelessWidget { const ContainerTest({super.key}); @override Widget build(BuildContext context) { return Container( child: Text("텍스트"), ); }}결과 ( Android / iOS ) Container기본 위젯 박스사용법class ContainerTest extends StatelessWidget { const ContainerTest({super.key}); @override Widget build(BuildContext context) { return Container( child: T..

컨텐츠 미리보기 등 목업 구성에 사용사용법Placeholder()결과 ( Android / iOS ) Flutter 모음 Flutter idghst.tistory.com

@State화면 동작에 있어 상태를 나타내는 변수가 사용되는 경우해당 변수가 상태를 나타냄을 표시 해줍니다struct PlayerView: View { let episode: Episode @State private var isPlaying: Bool = false var body: some View { VStack(spacing: 20) { Text(episode.title) .font(.largeTitle) Text(episode.showTitle) .font(.title3) .foregroundColor(.gray) ..

TextView 기본 Text("SwiftUI") 수정 Text("SwiftUI") .font( .system( size: 30, weight: .bold, design: .default )) 결과물 ButtonView 기본 Button { print("button tapped") } label: { print("click me") } 수정 Button { print("button tapped") } label: { Text("click me") .font( .system( size: 20, weight: .bold, design: .default) ) .foregroundColor(.white) .padding() } .padding() .frame(height: 100) .background(.pin..

...ViewModel.swift viewModel 에서는 input 과 output 을 작성합니다 input 에서는 User Action 등 입력 데이터를 output 에서는 처리한 Data 로 결과 데이터를 화면에 뿌려줍니다 init() 초기화 함수에서는 viewModel 에서 동작할 변수를 초기화하는 기능을 수행합니다 import Foundation import Combine final class FrameworkListViewModel { init(items: [AppleFramework], selectedItem: AppleFramework? = nil) { self.items = CurrentValueSubject(items) self.selectedItem = CurrentValueSubje..

왜 MVVM이 생겼나? 기존 MVC 패턴의 문제 View 와 View Controller 는 View 와 Controller 레이어로 나누어 설명하지만 실제로 구현 시, 거의 분리되지 않습니다 따라서, 위 그림과 같이 표현되는게 좀 더 현실모습을 잘 담고 있습니다 이러다 보니, View Controller 에 많은 로직들이 존재하게 됩니다 프레젠테이션 로직 비즈니스 로직 데이터 접근 로직 등등.. 결국에 Massive ViewController 라는 불명예 스러운 용어가 붙었습니다 위와 같은 이슈로 발생하는 문제 View Controller 가 너무 많은 책임을 지고 있음 모델(데이터)를 직접 접근하면서 수정하다보니, 버그에 취약하게 됨 유지보수가 어려움 (변경과 수정에 어려움이 많아짐) 기존 문제들의 ..

Publisher+Utils.swift import Foundation import Combine extension Publisher { static func empty() -> AnyPublisher { return Empty().eraseToAnyPublisher() } static func just(_ output: Output) -> AnyPublisher { return Just(output) .catch { _ in AnyPublisher.empty() } .eraseToAnyPublisher() } static func fail(_ error: Failure) -> AnyPublisher { return Fail(error: error).eraseToAnyPublisher() } } Netw..

iOS 에서는 HTTP 방식으로 네트워크 할 수 있으며 URLSession 을 사용합니다 URLSession URLSession을 이용해서 서버와 소통 URLSessionConfiguration .default 디스크를 이용한 정보 저장을 하는 configuration 그냥 브라우저 띄울때 .ephemeral default 랑 비슷한데, 몇가지 정보들을 저장하지 않음 (쿠키, 인증서 등) 브라우저 시크릿 모드라고 생각하면 쉬움 .background 네트워크를 통해 파일 다운로드 받을때, 앱이 백그라운드에서 돌때도, 다운로드 시켜줄수 있음 URLSession configuration 을 보고, 세션을 생성 URLSessionTask dataTask uploadTask downloadTask URLSessi..

Combine 초기화 컴바인 subscription 저장소를 만들어줍니다 var subscription = Set() 입력용 publisher 를 설정 해줍니다 let didSelect = PassthroughSubject() 출력용 publisher 를 설정 해줍니다 let items = CurrentValueSubject(AppleFramework.list) 구독 기능 수행을 위한 함수 함수 실행 시, input 과 output 에 대한 구독을 진행합니다 Input input 에 데이터가 추가되면 관련 기능이 수행됩니다 output input 에 의한 기능 수행되면 자동으로 output 의 데이터가 자동으로 전달되며 output 에 대한 기능이 수행됩니다 private func bind() { // ..

앱 또는 웹에서 사용할 데이터를 가져와 사용할 때, API 를 자주 활용합니다. API 사용할 때, 보통은 Open API 또는 직접 서버를 구축하여 이용할 겁니다. Firebase 역시 데이터는 비슷한 형식으로 사용하지만 REST API 처럼 json 을 직접 사용하는 것이 아니라 함수를 사용하여 데이터를 이용하기 때문에 개발 방식 자체가 다릅니다 그래서 OpenAPI를 사용하지 않고 직접 서버를 구축하여 진행할 프로젝트에서 개발 중 서버를 항상 켜놓을 수 없거나 특정 데이터에 대해서 미리 테스트할 수 있도록 API 를 제공해주는 사이트를 소개합니다. mockAPI 기능 프로젝트에서 1개의 API 를 생성할 수 있으며 자동으로 호출 URL이 생성됩니다 NEW RESOURCE 를 통해 API 를 정의하여..