코딩의 유익함 (13) 썸네일형 리스트형 SwiftUI - GeometryReader(지오메트리 리더) GeometryReader는 SwiftUI에서 제공하는 여러 컨테이너 뷰 중의 하나이며, 자식 뷰에게 부모 뷰와 기기에 대한 전반적인 정보를 전달하는 역할을 합니다. 먼저 그 정의부터 살펴보고 내용을 하나씩 알아보도록 하겠습니다. GeometryReader 구조체는 View 프로토콜을 채택하고 있습니다. 그리고 제네릭으로 선언된 Content 역시 반드시 View 프로토콜을 채택해야만 한다고 강제하고 있습니다. content 프로퍼티는 그 타입이 클로저(함수 형태)인데요. 풀어서 GeometryProxy 타입의 인자를 1개 받아서 Content 타입(뷰 프로토콜을 채택하는)을 반환하는 클로저 타입입니다. 생성자에는 content 매개변수에 @ViewBuilder 속성이 선언되어 있으므로, 뷰를 전달받아 .. SwiftUI - @State와 @Binding 알아보기 SwiftUI에서는 기본적으로 구조체에서 View프로토콜을 구현하여 View(사용자 화면)를 다룹니다. Xcode에서 프로젝트를 만들 때 SwiftUI를 선택하면 ContentView 구조체가 생성되고 여기서 뷰를 다룹니다. 그런데 이 ContentView 구조체 안에서 var 키워드로 선언한 프로퍼티의 값을 구조체 내(보통 body 프로퍼티)에서 변경하려고 하면 에러가 뜹니다. 즉, 변경할 수 없다는 것인데요. 왜 그런 것일까요? Swift의 구조체에서 mutating으로 선언되지 않은 연산 프로퍼티는 구조체 내부에서 그 값의 변경이 불가합니다. 그러면 연산 프로퍼티인 body를 mutating으로 선언해주면 될까요? 안됩니다. View 프로토콜의 body 프로퍼티는 { get } 으로 되어 있으며, .. SwiftUI - 커스텀 버튼 스타일 만들기(ButtonStyle, PrimitiveButtonStyle) SwiftUI에서 제공하는 버튼(Button) 스타일은 2가지가 있습니다. 바로 BorderlessButtonStyle과 PlainButtonStyle인데요. 그럼 이 2가지 외의 스타일은 만들 수 없는 것일까요? 아닙니다. SwiftUI에서는 친절(?)하게 이 2가지 외에 우리가 직접 버튼 스타일을 만들 수 있도록 하고 있습니다. 그럼 어떻게 만들어야 하는지 살펴보기 전에 기존 스타일들을 어떻게 적용했었는지 살펴볼게요. 그림) 커스텀 버튼 스타일(1) 빨간 박스를 보시면, buttonStyle 수식어를 적용하면서 위에서 말씀드렸던 2가지의 스타일을 인자로 전달하고 있습니다. 즉 우리가 원하는 버튼 스타일을 만들게 되면 아래와 같이 사용하게 됩니다. 그렇다면 buttonStyle 수식어를 사용해서 우리의.. SwiftUI - ViewModifier(커스텀 뷰 수식어) 만들기 SwiftUI에서 View를 조금 더 간편하게 사용할 수 있도록 돕는 ViewModifer 프로토콜에 대해서 살펴보겠습니다. 보통 SwiftUI에서 View를 우리의 입맛대로 꾸미기 위해서 수식어를 적용합니다. 위의 그림과 같이 말이죠. 그런데, 문득 반복적으로 사용하는 뷰와 그에 따른 수식어들이 있다는 것을 느낍니다. 그때마다 똑같은 수식어들을 작성해주는 것은 코드의 양이 많아져 보기에도 좋지 않을 뿐만 아니라, 스트레스(?)를 유발하지요. 그때 바로 ViewModifer 프로토콜을 적절히 사용하면 아주 편리한데요. 그렇다면 ViewModifer 프로토콜은 어떻게 생겨먹은 물건(?)인지, 그 모습을 보면 아래의 그림과 같은데요. 보기만 해도 현기증이 나지 않나요? 아직 SwiftUI가 익숙하지 않은 분.. Swift(스위프트) - Property Wrappers(프로퍼티 래퍼) 알아보기 Swift 문법을 공부하다 보면, 또는 누군가가 작성해놓은 프로그램을 보다 보면 프로퍼티 앞에 @가 붙은 어떤 선언 속성을 접하신 적 있으시지요? 바로 그 @가 붙은 Property Wrappers에 대해서 알아보도록 하겠습니다. 보통 Property Wrappers 쉽게 코드를 재사용하거나, 반복되는 코드를 제거하기 위해 많이 사용합니다. 위 그림처럼 커스텀 Property Wrappers를 만들려면 @Property Wrappers 붙여주면 되는데요. 아래의 예제를 작성하면, 결과적으로 @StandardWeight를 프로퍼티 앞에 붙여 사용할 수 있게 됩니다. 자, 그런데 익숙하지 않은 wrappedValue 변수가 하나 있는데요. 이 변수는 커스텀 Property Wrappers를 구현할 때 필수로.. SwiftUI - Text(문자열 뷰)의 주요 수식어 살펴보기 SwiftUI의 가장 기초적인 뷰의 종류의 하나인 Text에 대해서, 또 Text의 수식어에 대해서 살펴보겠습니다. 여기서 수식어라는 것은 뷰가 가지고 있는 함수들을 일컫는 말이라고 합니다. UI를 자신이 원하는데로 꾸미기 위해서는 이 수식어들을 정확하게 알 필요가 있습니다. Text가 가지고 있는 주요 수식어들이 어떠한 역할을 하는지 차례차례 차근차근 살펴보도록 하겠습니다. 1. Text의 수식어 1.1 font는 글자의 크기, fontWeight는 글자 굵기 그림 "font 수식어" 에 Text 뷰에서 엔터 키를 친 후 .을 찍으면 여러 가지 수식어가 나오는데, 그 중에서 font를 선택합니다. 다시 괄호 안에 ,을 찍게되면 여러 가지 프로퍼티들을 선택할 수 있습니다. V로 표시된 프로퍼티들을 적용하.. SwiftUI - ContentView 구조 이해하기 iOS 프로그래밍을 시작해보려고 하는데, 프로젝트 생성에 앞서 Storyboard와 SwiftUI를 선택하는 화면이 있더라고요. 그래서 이게 무엇인가 찾아보니 UI를 만드는데 어떤 방식을 채택할 것이냐 하는 문제더라고요. 그래서 검색을 해봤습니다. Stroyboard는 과거부터 현재까지 계속 사용하고 있는 방식이고, SwiftUI는 2019년 6월 즈음에 애플이 새롭게 출시한 UI 프레임워크더라고요. 저는 과감하게 새로운 것을 택하기로 했습니다. 새로운 SwiftUI를 선택한 이유는 애플이 새롭게 출시했다는 것은 강하게 추진한다는(?) 것이겠죠. 그래서 먼 미래에는 SwiftUI의 점유율이 높아질 것으로 예상되기 때문입니다. 물론 당분간은 Storyboard가 더 많겠지만요. 서론이 너무 길었습니다. 아.. Swift(스위프트) - Realm 설치 및 연동 예제 cocoapods를 설치했다는 가정하에 글을 작성하겠습니다. 설치를 하지 않으신 분은 아래의 링크로 이동해서 설치하시면 되겠습니다. https://value-of-life.tistory.com/152 1. cocoapods을 이용하여 Realm 설치하기 1.1 프로젝트 생성 -> 해당 경로로 이동 -> "pod init" 명령어 실행 여기서 주의하셔야 할 사항은 프로젝트 경로에 .xcodeproj가 있는 경로로 이동해야 한다는 것입니다. 그렇지 않으면 다음과 같은 "No Xcode project found, please specify one" 에러가 나오는데 이는 보통 프로젝트 내부로 더 들어가서 실행한 경우입니다. 1.2 프로젝트 내부에 "PodFile" 하나가 생성된 것을 확인 1.3 "Podfile.. 이전 1 2 다음