basicText는 아래와 같이 modifier들을 사용가능.struct SwiftUIView: View { var body: some View { Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus tempus sem at congue varius. Nunc vulputate purus eros, vitae venenatis turpis blandit in.") .bold() // 볼드체 .italic() // 이텔릭 .strikethrough(true, color: .blue) // 취소선 .underline(true,..
SwiftUI
SwiftUI의 뷰 계층에서 UIKit을 사용하기 위한 방법으로 UIViewRepresentable, UIViewControllerRepresentable 을 제공. (https://swifty-cody.tistory.com/44) 반대로 UIKit 뷰 계층에서 SwiftUI를 사용하기 위한 방법으로 UIHostingViewController를 제공함. https://developer.apple.com/documentation/swiftui/uihostingcontroller UIHostingController | Apple Developer DocumentationA UIKit view controller that manages a SwiftUI view hierarchy.developer.apple...
(WWDC22) Hello Swift Charts(WWDC22)Swift Charts: Raise the bar Swift Charts FrameworkApple이 디자인한 Chart를 만들기 위한 Framework.SwiftUI와 동일한 선언적 문법. Mark차트에서 각 항목에 대한 요소를 Mark라고 함.위 그림에서 Mark는 Bar Mark.import Chartsimport SwiftUIstruct StylesDetailsChart: View { var body: some View { Chart { BarMark( x: .value("Name", "Cachapa"), y: .value("Sales", 90..
TCA가 앱 개발에서 해결하고자 하는 것상태(State) 관리: 간단한 값 타입들로 어플리케이션의 상태를 관리하는 방법, 상태를 공유를 통해 화면에서 일어나는 변화(Mutation)를 다른 화면에서 즉시 관측(Observe)하는 방법을 제공.합성(Composition): 기능을 여러 개의 독립된 모듈로 추출하는 방법, 이 모듈을 다시 합쳐서 거대한 기능을 작은 컴포넌트의 집합으로 구성하는 방법을 제공.사이드 이펙트(Side Effects): 어플리케이션 바깥세상과 접촉하는 작업을 테스트할 수 있고 이해하기 쉽게 작성하는 방법을 제공.테스팅(Testing): 아키텍처 내부의 기능을 테스트하는 방법뿐만 아니라 여러 파트로 구성된 기능의 통합 테스트를 작성하는 방법, 사이드 이펙트가 어플리케이션에 끼치는 영향..
WWDC의 Demystify SwiftUI를 정리한 내용입니다.SwiftUI는 선언적UI로서 고수준의 앱이 원하는 것을 Describe하면 SwiftUI가 이를 구현하는 방법을 정확히 결정.대부분의 경우 잘 작동하지만, 예상하지 못한 동작을 하는 순간은 생겨나는데,이런 순간에 원하는 결과를 얻기 위해 SwiftUI가 뒤에서 무엇을 하는지 이해하는 것이 도움이 됨. SwiftUI가 코드를 볼때 무엇을 보는가Identity: SwiftUI가 앱의 여러 업데이트에서 element를 동일하거나 별개로 인식하는 방법Lifetime: SwiftUI가 시간이 지남에 따라 View와 데이터의 존재를 추적하는 방법의존성: SwiftUI가 인터페이스를 업데이트해야하는 시기와 이유를 이해하는 방법위 세가지 개념이 Swift..
Platforms State of the Union을 훝고 갑니다. 추후 각 세션 정리 예정입니다. Swift Swift Macros Boilerplate 코드를 좀 더 깔끔하게 만들어 줄 수 있는 방법입니다. 위처럼 @가 붙은 attribute일 수도 있고, 독립적으로 #이 붙은 형태일 수도 있습니다. 이 #URL Macro는 URL을 초기화하여 언래핑시켜주는 코드인데, 해당 Macro에서 Expand Macro를 통해 확인이 됩니다. 그 뿐만 아니라 유효한 URL String인지도 컴파일 타임에 체크해주고, 올바른 코드를 작성할 수 있도록 커스텀 피드백을 할 수 있게 해줍니다. fetchContent(_:completion:) 함수에 async/await을 사용하고 싶을 땐, 위처럼 @AddAsync..
Xcode 14.3이 릴리즈되면서 Swift 5.8도 업데이트되었습니다. 변경점들을 간단하게 정리해봅니다. Function back deployment (SE-0376) @backDeployed(before:) attribute를 통해 이전 버전의 프레임워크에서 새 API를 사용할 수 있게 해줍니다. 함수에 대한 코드를 앱의 바이너리에 작성 후 런타임 시 검사하여 수행됩니다. 사용자가 적절한 새 OS를 사용하는 경우 시스템 자체 버전의 함수가 사용되고, 아닌 경우 앱 바이너리에 복사된 버전에 대신 사용됩니다. 단, @backDeployed는 함수, 메서드, 서브스크립트, 계산프로퍼티에만 적용됩니다. 당연하게도 만능으로 새 기능을 이전 OS에서 쓸 수 있게 한다던가 하는건 아닌거죠. 아래는 예시입니다. @..
MVI pattern이 오고 있습니다.(이미 왔나요?) 이번에 다녀온 SyncSwift2022 컨퍼런스에서 MVI 패턴에 대한 언급이 2회 등장했습니다. 두번 모두 SwiftUI에 대한 설명중에 선언적 UI인 SwiftUI에서는 MVVM보다는 MVI패턴이 더 어울린다는 내용이었습니다. 여기서 MVI는 Model, View, Intent를 의미하고, 아래와 같은 단방향 데이터 흐름을 보여주는 패턴입니다. View로부터 사용자가 UI event를 일으키면, 그 action을 받아서 Intent가 Model의 State를 update시키고, 그 update된 Model의 State를 View가 반영해서 사용자에게 보여주는 흐름입니다. (SyncSwift2022에서 문상봉님 세션에서는 Intent역할을 좀더 세..
바로 이전 글에서 정리했던 ViewModifier 프로토콜과 유사하게ButtonStyle 이라는 프로토콜이 있습니다.이 프로토콜로 작성한 구조체는SwiftUI Button의 .buttonStyle() modifier를 통해 ButtonStyle을 설정할 때 쓸 수 있습니다. 간단한 예제입니다.ButtonStyle 프로토콜의 구조체는func makeBody(configuration:) -> some view 를 구현해주면 됩니다.struct CustomButtonStyles: ButtonStyle { var systemName: String var title: String func makeBody(configuration: Configuration) -> some View { ..
ViewModifier 프로토콜은'View 혹은 View Modifier에 적용해서 기존과 다른 버전을 생성하는 프로토콜' 입니다.다시말해 커스텀 Modifier를 만들 수 있게 해주는 프로토콜입니다. 간단한 예시로 보겠습니다.아래와 같이 ViewModifier 프로토콜을 작성해줍니다.저는 제 앱에서 공통으로 사용할 타이틀 크기와 색상을 지정해주었습니다.struct MyAppTitle: ViewModifier { func body(content: Content) -> some View { return content .font(.system(size: 30, weight: .bold)) .foregroundColor(.indigo) }} 그리..
지난 글에서는 Swift, SwiftUI 작성시 자주 마주하는 Property Wrapper 중에서 @State, @Binding, @Published, 그리고 @ObservedObject가 무엇인지 정리해봤습니다. 이번 글에서는 @EnvironmentObject와 @Environment에 대해 정리해봅니다. @EnvironmentObject SwiftUI에서는 환경값이 바뀌었을 때, 해당값에 따라서 뷰를 그릴 수 있게 해주는 @EnvironmentObject라는 Property Wrapper를 제공합니다. @EnvironmentObject Property Wrapper는 이전글에서 다룬 ObservableObject 프로토콜을 따르는 프로퍼티에만 사용할 수 있습니다. 이 값은 부모뷰로부터 주입된 값으로..
지난 글에서는 Property Wrapper가 무엇인지 정리해봤습니다. 이번 글에서는 Swift, SwiftUI로 작성 시 자주 쓰게 되는 Property Wrapper를 정리해보겠습니다. @State와 @Binding @State와 @Binding은 SwiftUI에서 자주 사용하는 Property Wrapper입니다. @State로 선언한 값을 참조하여 SwiftUI를 그리면, 해당 값이 변경될 때 SwiftUI가 이를 반영하여 변경됩니다. // 예시 struct PlayButton: View { @State private var isPlaying: Bool = false var body: some View { Button(isPlaying ? "Pause" : "Play") { isPlaying.to..
Swift, SwiftUI로 코드를 작성하다보면 프로퍼티 앞에 붙여주는 아래와 같은 친구들(?)을 마주하게 됩니다. @main, @Environment, @State, @Binding, @Published, @ObservedObject, @ViewBuilder, @escaping 등.. @가 앞에 붙어 있는 이 친구들은 Property Wrapper라고 부릅니다. 그 동안은 그냥 각각의 용도에 맞춰서 프로퍼티 앞에 붙여서 사용하고 있었는데, (1)에서는 이 Property Wrapper가 무엇인지 알아보고, (2)(다음글)에서는 자주 마주하는 Property Wrapper들의 용도도 정리해보려 합니다. swift.org의 property 문서를 보면 Property Wrapper의 설명이 아래와 같이 되..
아직까지는 iOS의 수많은 프로젝트가 UIKit기반일 듯 한데요.그래서 Apple에서는 SwiftUI를 밀고 있으면서도UIKit을 SwiftUI에서 재사용하거나, 최근(WWDC2022)에는 UIKit(UITableview)에 SwiftUI를 녹여서 쓸 수 있는 방법을 제시하고 있습니다. 그중에서 SwiftUI에서 UIKit을 사용할 수 있도록 제공하는 방법이UIViewRepresentable, UIViewControllerRepresentable 프로토콜입니다.UIViewRepresentable 프로토콜은 UIView를UIViewControllerRepresentable 프로토콜은 UIViewController를 SwiftUI에서 사용할 수 있도록 해줍니다.두 프로토콜들은 iOS 13.0부터 사용 가능합..
SomeSwiftUIView라는 SwiftUI 파일을 생성을 하면하단에 SomeSwiftUIView_Preview라는 이름의 PreviewProvider 프로토콜을 따르는 구조체가 함께 생성이 됩니다.struct SomeSwiftUIView_Previews: PreviewProvider { static var previews: some View { SomeSwiftUIView() }} 이 구조체는1. 우리가 작성한 SwiftUI View의 내용을 Preview(혹은 Canvas)에 반영시켜주거나,2. PreviewProvider 내의 previews의 내용을 Preview에 반영시켜주어우리가 확인하고자 하는 View를 빠르게 확인할 수 있게 해줍니다.1. 우리가 실제로 작성해서 사..