SWIFTUI/Grammar22 SwiftUI : @escaping @escaping에 대해 알아보도록 합시다. @escaping 이란? Escaping클로저는 클로저가 함수의 인자로 전달됐을 때, 함수의 실행이 종료된 후 실행되는 클로저입니다. Non-Escaping클로저는 이와 반대로 함수의 실행이 종료되기 전에 실행되는 클로저입니다. 앱을 만들면서 우리는 자주 인터넷에서 데이터를 다운로드해야 합니다. 이때 바로 비동기(Async) 코드를 사용해야 합니다. 보통 함수를 실행할 때는 위에서 아래로 함수가 실행되는데 만약 우리가 데이터베이스로 갈 때에는 인터넷에서 데이터를 다운로드한 뒤에 이 데이터를 바로 앱으로 가져올 수 없습니다. 왜냐하면 먼저 서버로 이동하고 데이터를 가져오기까지 몇 초의 시간이 걸리기 때문이죠. 그렇기 때문에 비동기 처리를 해야 합니다. 그리고 이.. SWIFTUI/Grammar 2021. 6. 11. SwiftUI : If let과 Guard If let / Guard 안전한 코딩은 정말 좋은 코드입니다. 값이 있는지 없는지 선택적 변수인지의 여부 등을 안전하게 나타내 줍니다. 안전한 코딩에는 if let과 guard let이 있습니다. If let의 대안은 guard let이며 unwrapping 옵셔널도 이에 해당합니다. guard let은 우리를 위해 언래핑 되지만, 내부에서 nil을 찾으면 사용한 함수, 루프 또는 조건을 종료할 수 있습니다. guard let 도 if let과 비슷하지만 다른 점이 있습니다. guard라는 것은 지키다 라는 뜻처럼, guard 문은 특성상 함수(메서드)에서만 쓰이며, guard구문의 조건을 만족하지 못하면 else문으로 빠져서 함수의 실행을 종료시킬 때 사용합니다. If let SwiftUI에서 사용해.. SWIFTUI/Grammar 2021. 5. 14. SwiftUI : onAppear() onAppear() View 가 나타날 때 실행될 acttion을 추가합니다. SwiftUI는 UIKit의 ViewDidDisplay() 와 동등한 기능을 제공합니다. 원하는 모든 코드를 이 두 이벤트에 첨부할 수 있고, SwiftUI는 이벤트가 발생할 때 이것을 실행합니다. 즉 특정 뷰가 화면에 나타날 때 특정 항목을 로드합니다. struct ContentView: View { var body: some View { NavigationView { VStack { NavigationLink(destination: DetailView()) { Text("onAppear() & onDisappear()") } } } } } struct DetailView: View { var body: some View {.. SWIFTUI/Grammar 2021. 5. 14. SwiftUI : Identifiable protocol Identifiable SwiftUI에서 identifiable은 자주 쓰이기 때문에 반드시 알아둬야 할 프로토콜입니다. 이것에 대해 알아보기 전에 이 프로토콜이 생겨난 배경에 대해서 먼저 알아보도록 하겠습니다. 만약 앱 내에 다음 Product 구조체타입을 정의했다고 가정해보도록 하겠습니다. Struct Product { let name: String let price: Int } 그리고 Product 타입을 사용하여 제품명과 가격이 같은 객체를 생성해보도록 하겠습니다. let PS5 = Product(name: "controller", price: 100) let PS4 = Product(name: "controller", price: 100) 이것을 Equatable 프로토콜을 채택하고 바교해보면 .. SWIFTUI/Grammar 2021. 5. 3. SwiftUI : @Namespace / matchedGeometryEffect() 애니메이션 동기화 .matchedGeometryEffect 에 대해 알아보도록 합시다. MatchedGeometryEffect 만약 view계층의 서로 다른 부분에 동일한 view가 나타나는 등 두 view사이에 애니메이션 효과를 주려면 .matchedGeometryEffec()수정자를 사용하는 것이 좋습니다. 이 수정자를 사용하려면 동일한 view모두에 이 수정자를 연결해줘야 합니다. 이렇게 하면 두 개의 view상태를 전환 할 때 SwiftUI가 동기화된 view에 원활하게 애니메이션을 적용시킬 수 있습니다. 우선 간단하게 가장 쉬운 animation효과만 적용시켜서 예를 들어보겠습니다. import SwiftUI struct ContentView: View { @State private var isFlipped = .. SWIFTUI/Grammar 2021. 4. 30. SwiftUI를 위한 Clean 아키텍처 목차 본 게시글은 Clean Architecture for SwiftUI 게시글을 번역한 자료 입니다. 원작자의 깃허브 : Alexey Naumov UIkit이 나온 지 벌써 11년이 되었습니다. iOS SDK 가 2008년에 출시되었을 때부터 우리는 UIKit으로 앱 개발을 해왔습니다. 그 긴 시간 동안 개발자들은 각자의 앱에 적용할 최고의 아키텍처를 고민했습니다. MVC로 시작해서 MVP, MVVM, VIPER, RIBs, VIP에 이르기까지 다양합니다. 하지만 이제 큰 변화가 찾아왔습니다. SwiftUI의 등장으로 지금까지 iOS를 위해 주로 쓰이던 아키텍처 패턴들은 역사 속으로 사라질 것입니다. 좋던 싫던 SwiftUI는 iOS 개발의 미래가 될 것입니다. 그리고 우리가 아키텍처를 설계할 때 직면.. SWIFTUI/Grammar 2021. 4. 6. SwiftUI : @Environment 프로퍼티 래퍼 Environment 에 대해 알아보도록 합시다. Environment 앞에서 다룬 Environment수식어가 뷰의 환경 요소를 변경시키기 위한 쓰기 전용의 기능이었다면, 이번에 볼 @Environment라는 프로퍼티 래퍼는 읽기 전용으로 특정 뷰에서 EnvironmentValues의 특정 요소를 읽어와 뷰 구성에 반영할 때 사용합니다. 예를 들어, 영어, 한국어, 중국어와 같이 일반적으로 사용되는 LTR(Left to Right)환경과 아랍어나 히브리어처럼 중동지역에서 사용되는 RTL(Right to Left)언어 환경에서 뷰를 서로 다르게 표현하고 싶다고 가정해보겠습니다. 이럴 땐 Environment를 사용하여 여러가지 환경 변수 중 layoutDirection을 선택하고, 레이아웃 방향에 대한 .. SWIFTUI/Grammar 2021. 4. 6. SwiftUI : EnvironmentValues EnvironmentValues 에 대해 알아보도록 합시다. Environment SwiftUI에서는 뷰를 구성하는 데 필요한 각종 환경 설정과 관련된 정보를 EnvironmentValues타입이 관리합니다. colorScheme, timeZone, locale, calendar, layoutDirection, sizeCategory, undoManager등 기존에는 UITraitCollection을 비롯해 다양한 클래스에서 나뉘어 사용하고 관리되던 속성들을 이제 EnvironmentValues 하나에 모두 담아서 쉽게 접근하고 관리할 수 있습니다. 이 EnvironmentValues는 프레임워크에 의해 별도로 관리되고 있으므로 어떤 뷰에서든 접근할 수 있는데, 이때 얻게 되는 값은 상위 계층의 뷰가 가.. SWIFTUI/Grammar 2021. 4. 5. SwiftUI : EnvironmentObject '뷰간에 데이터 공유' 앞 게시물 ObservedObject를 먼저 보고 오시는것을 추천합니다. 이번 게시물에서는 앞에서 썼던 코드를 재사용 합니다. 이번에는 EnvironmentObject에 대해 알아보도록 하겠습니다. EnvironmentObject 앱의 많은 뷰와 공유해야하는 데이터의 경우 SwiftUI는 EnvironmentObject속성 래퍼를 제공합니다. 이를 통해 필요한 곳 어디에서나 모델 데이터를 공유 할 수 있으며, 데이터가 변경 될 때 뷰가 자동으로 업데이트 된 상태로 유지됩니다. A View에서 데이터를 생성 후 👉🏻 B View 👉🏻 C View 로 전달 후, 최종적으로 👉🏻 D View로 전달하는 대신에, 특정 뷰에서 데이터를 생성 후 B,C,D가 전달 없이 공용으로 사용 가능 하게 할 수 있습니다... SWIFTUI/Grammar 2021. 4. 5. SwiftUI : #2 MVVM의 간단한 예제 저번 게시글에서 MVVM이 무엇이고 어디에 쓰는지 알아보았습니다. 이제 Xcode에서 MVVM을 어떻게 하용하는지 간단한 예제를 통해 알아보려고 합니다. MVVM의 간단한 예제 새로운 Xcode 프로젝트를 생성하여 시작하도록 하겠습니다. 일반적으로 아래와 같이 생성하게 되면 Model 👉🏻 View 로 직접적으로 화면을 구성해주게 됩니다. 아래 코드를 보면 age가 Int로 정해져있습니다. //Models struct Person { var name: String var age: Int } //Views struct ContentView: View { let seogun = Person(name: "서근", age: 26) var body: some View { VStack { Text(seogun.na.. SWIFTUI/Grammar 2021. 2. 17. SwiftUI : #1 디자인 패턴 과 MVVM (Design Patterns and MVVM) Design Patterns 디자인 패턴은 소프트웨어 디자인의 일반적인 문제에 대한 재사용이 가능한 해결책입니다. 개발에서 비슷한 문제를 해결하는데 일종의 템플릿이나 개발패턴이라고 할 수 있습니다. 느슨하게 결합된 코드를 작성하는데 도움이되므로 번거로움 없이 코드의 구성요소를 변경하거나 교체할 수 있습니다. 이 패턴을 적용하면 코드의 가독성, 효율성, 디버깅, 협업 등이 쉬워집니다. ⭐️디자인 패턴을 사용하여 모든 종류의 언어에 모든 종류의 프레임워크를 사용 할 수 있습니다. 이 과정에서 사용되는 MVVM 에 대해 알아보겠습니다. MVVM MVVM의 의미는 다음과 같습니다. 예를들어 고객 정보 / 쇼핑카드 정보, 또는 기타정보가 있는Model 이 있고, iPhone 또는 Android 화면인 View 가.. SWIFTUI/Grammar 2021. 2. 15. SwiftUI : #2 ObservedObject '클릭시 값 증가' ObservedObject에 관한 첫 번째 게시글을 보시려면 여기를 클릭해주세요. ObservedObject 저번 게시물에서는 ObservedObject를 이용해서 Timer를 만들어 봤습니다. 이번에는 다른 예시를 통해서 한번 더 확실하게 배워보도록 하겠습니다. :) 저번 timer를 만들 때처럼 새로운 Swift 파일을 만들어주고 'UserSetting'으로 정해줬습니다 //UserSetting View import Foundation import SwiftUI import Combine class UserSetting: ObservableObject{ @Published var score: Int = 0 } score을 정수 0으로 정해줬고, 버튼을 클릭할 때마다 score이 올라가도록 하려고 합니.. SWIFTUI/Grammar 2021. 2. 14. SwiftUI : #1 ObservedObject '간단한 타이머 만들기' 저번 게시물에서 다뤘던 내용이지만 따로 자세히 알아보도록 하겠습니다. @ObservedObject = 복잡한 프로퍼티(여러 프로퍼티나 메서드가 있거나, 여러 view에서 공유할 수 있는 커스텀 타입이 있는 경우) String이나 integer같은 간단한 로컬 프로퍼티 대신 외부 참조 타입을 사용한다는 점을 제외하면 @State와 매우 유사. @ObservedObject와 함께 사용하는 타입은 ObservableObject프로토콜을 따라야함. @ObservedObject가 데이터가 변경되었음을 view에 알리는 방법은 여러 가지가 있지만 가장 쉬운 방법은@Published 프로퍼티 래퍼를 사용하는 것. = SwiftUI에 view reload를 트리거. ObservedObject를 이용해서 간단한 Time.. SWIFTUI/Grammar 2021. 2. 14. SwiftUI : State and Binding '클릭시 화면 변경' 앞에서 @State와 @Binding을 배워봤으니 간단하게 프로젝트를 만들어서 활용해보도록 하겠습니다. 클릭시 화면 변경 뷰 생성 우선 화면에 표시될 뷰를 따로 만들어 주겠습니다. //musicPlay View import SwiftUI struct Episode { let song: String let singer: String let track: String } struct musicPlay: View { let episode = Episode(song: "Dynamite", singer: "BTS", track: "DayTime Version") @State var isPlaying = false var body: some View { VStack { Text(self.episode.song) .f.. SWIFTUI/Grammar 2021. 2. 12. SwiftUI : #3 Understanding @Binding Binding에 관한 첫번째 게시글을 보시려면 여기를 클릭해주세요. Binding에 관한 두번째 게시글을 보시려면 여기를 클릭해주세요. Understanding @Binding 저희는 이전 게시물에서 Binding이 정확히 무엇인지 배워봤습니다. 이제 바인딩에 대해 다시 살펴보고 바인딩을 사용하여 애플리케이션을 만드는 방법을 살펴보도록 하겠습니다. 첫번째로 할것은 음악 트랙에 따라 달라지는 UI를 만들어 보겠습니다. Xcode 프로젝트명을 'SwiftUI_Binding_music'으로 생성하고 새로운 그룹을 만들어서 모델 안에 새로운 Swift 파일을 만듭니다. //Episode.swift import Foundation struct Epicode { let song: String let singer: .. SWIFTUI/Grammar 2021. 2. 12. 이전 1 2 다음 한국어 (기본) English Русский 日本語 👉🏻 잠깐만요! 이 글도 한 번 보고 가세요 이전글 다음글 티스토리툴바 서근 개발노트구독하기