iOS/Swift

· iOS/Swift
바로 이전 글에서 정리했던 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 { ..
· iOS/Swift
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) }}  그리..
· iOS/Swift
지난 글에서는 Swift, SwiftUI 작성시 자주 마주하는 Property Wrapper 중에서 @State, @Binding, @Published, 그리고 @ObservedObject가 무엇인지 정리해봤습니다. 이번 글에서는 @EnvironmentObject와 @Environment에 대해 정리해봅니다. @EnvironmentObject SwiftUI에서는 환경값이 바뀌었을 때, 해당값에 따라서 뷰를 그릴 수 있게 해주는 @EnvironmentObject라는 Property Wrapper를 제공합니다. @EnvironmentObject Property Wrapper는 이전글에서 다룬 ObservableObject 프로토콜을 따르는 프로퍼티에만 사용할 수 있습니다. 이 값은 부모뷰로부터 주입된 값으로..
· iOS/Swift
지난 글에서는 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..
· iOS/Swift
Swift, SwiftUI로 코드를 작성하다보면 프로퍼티 앞에 붙여주는 아래와 같은 친구들(?)을 마주하게 됩니다. @main, @Environment, @State, @Binding, @Published, @ObservedObject, @ViewBuilder, @escaping 등.. @가 앞에 붙어 있는 이 친구들은 Property Wrapper라고 부릅니다. 그 동안은 그냥 각각의 용도에 맞춰서 프로퍼티 앞에 붙여서 사용하고 있었는데, (1)에서는 이 Property Wrapper가 무엇인지 알아보고, (2)(다음글)에서는 자주 마주하는 Property Wrapper들의 용도도 정리해보려 합니다. swift.org의 property 문서를 보면 Property Wrapper의 설명이 아래와 같이 되..
· iOS/Swift
아직까지는 iOS의 수많은 프로젝트가 UIKit기반일 듯 한데요.그래서 Apple에서는 SwiftUI를 밀고 있으면서도UIKit을 SwiftUI에서 재사용하거나, 최근(WWDC2022)에는 UIKit(UITableview)에 SwiftUI를 녹여서 쓸 수 있는 방법을 제시하고 있습니다. 그중에서 SwiftUI에서 UIKit을 사용할 수 있도록 제공하는 방법이UIViewRepresentable, UIViewControllerRepresentable 프로토콜입니다.UIViewRepresentable 프로토콜은 UIView를UIViewControllerRepresentable 프로토콜은 UIViewController를 SwiftUI에서 사용할 수 있도록 해줍니다.두 프로토콜들은 iOS 13.0부터 사용 가능합..
· iOS/Swift
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. 우리가 실제로 작성해서 사..
· iOS/Swift
Stand alone으로 돌아가는 앱도 있겠지만, 우리가 사용하는 많은 앱들은 서버와 통신을 주고받으면서 동작을 합니다. 서버와 데이터를 주고받을 때 주로 JSON 데이터를 사용하는데요. 이 JSON을 다룰 때 매우 유용한 게 Codable(Encodable, Decodable), CodingKey 입니다. Codable 공식문서를 먼저 보면, Codable은 Encodable, Decodable를 typealias를 한 것이며, type 혹은 제네릭 제약으로 Codable을 사용한다면 Encodable, Decodable 프로토콜을 모두 준수하게 된다.라고 되어있습니다. Encodable은 자신을 외부 표현으로 인코딩할 수 있는 형식이라고 되어 있는데, 이는 앱 내 데이터 모델을 JSON 데이터로 변환..
· iOS/Swift
joined 함수를 정리해봅니다. 시퀸스가 들어있는 배열일 때, 하나의 시퀸스로 이어주는 함수입니다. String도 Charactor의 시퀸스라고 볼 수 있고, 정수 배열 해당이 됩니다. String일 때와 그 이외의 배열일 때가 약간 다릅니다. String 배열의 joined String의 배열의 joined 함수의 정의는 아래와 같습니다. 매개변수로 seperator가 있고 생략했을 때는 ""가 기본으로 적용됩니다. String의 배열에 joined를 적용하면 아래처럼 이어집니다. let someAlmonds = ["HoneyButter", "Wasabi", "Corn", "Buldak", "MintChoco"] let joinedAlmonds = someAlmonds.joined() print(jo..
· iOS/Swift
CustomStringConvertible 프로토콜은 객체를 String으로 변환해서 표현하고 싶을 때 사용하는 프로토콜로, 주로 print()함수를 통해 출력할 때 유용합니다. 정의를 보면 description 계산 프로퍼티를 구현하도록 되어 있는 것을 확인할 수 있습니다. 예제에서는 Point 구조체를 CustomStringConvertible 프로토콜을 구현하여, print()함수 호출시 출력할 String을 정의해주었습니다. 사실 구조체는 CustomStringConvertible을 구현하지 않아도 어느 정도 String으로 변환해서 보여줍니다. 아래는 Almond 구조체입니다. print했을 때, 객체의 타입과 프로퍼티 값들을 보여줍니다. struct Almond { var name: Strin..
· iOS/Swift
이번 포스팅에서는 zip 함수를 정리해봅니다. Summary에서는 Sequence프로토콜을 따르는 두 개의 기본 시퀀스로 구성된 쌍의 시퀀스를 만들도록 되어 있습니다. 여기서 시퀸스 프로토콜은 '요소에 대한 순차적이고 반복적인 액세스를 제공하는 유형'으로 친숙한 배열에 이에 해당합니다. 아래는 예시입니다. let someAlmonds = ["Honey Butter", "Wasabi", "Corn", "Buldak", "Mint Choco"] let someNumbers = [0, 1, 2, 3, 4] let newSequence = zip(someAlmonds, someNumbers) for item in newSequence { print(item) } // 출력 //("Honey Butter", 0)..
· iOS/Swift
1급 객체(First class citizen)와 고차함수(고계함수) 프로그래밍 언어에서 1급 객체란 아래의 조건을 충족시키면 됩니다. 1. 변수나 데이터에 할당 할 수 있어야 한다. 2. 객체의 매개변수로 넘길 수 있어야 한다. 3. 객체의 반환값으로 리턴 할수 있 swifty-cody.tistory.com 이전에 썼던 고차함수 글에 이어서, Swift 표준 라이브러리에서 지원하는 고차함수인 filter, reduce, map을 정리해보겠습니다. 이 고차함수들은 컨테이너 타입(Array, Dictionary, Set, ...)에 구현되어 있는 제네릭 함수입니다. 우리가 주로 for문을 돌면서 어떤 결과를 추려낼 때 하던 작업을 이 함수들로 대체할 수 있습니다. // 예시로 사용할 컨테이너 let som..
· iOS/Swift
Equatable Equatable은 두개의 값이 동일한 값인지 아닌지 비교를 하기 위해서 따라야하는 프로토콜입니다. 이 프로토콜을 따르는 타입의 인스턴스는 == 나 != 연산자로 같은지, 같지 않은지 판단할 수 있게 됩니다. Swift 표준 라이브러리의 대부분의 기본 타입들(Int, Double, Float, String, Bool, ...)은 이 프로토콜을 따르고 있습니다. 기본 타입들이 아닌 클래스, 구조체도 해당 프로토콜을 따르면 비교연산자를 통해서 같은지, 아닌지 판단할 수 있게 됩니다. Equatable 프로토콜을 살펴보면 static func ==(lhs: Self, rhs: Self)->Bool 함수를 구현함으로써 해당 프로토콜을 쓸 수 있게 되어 있습니다. lhs는 ==의 왼쪽에, rhs..
· iOS/Swift
stride는 시작값(from)에서부터 끝값을 포함(through)하거나, 미포함(to)할 때까지 지정한 양(by)만큼 늘어나는 시퀸스를 반환하는 제네릭 함수입니다. // stride(from:to:by)는 to를 포함하지 않음 for i in stride(from: 0, to: 5, by: 1) { print(i) // 0, 1, 2, 3, 4 } // stride(from:through:by)는 through를 포함 for i in stride(from: 0, through: 5, by: 1) { print(i) // 0, 1, 2, 3, 4, 5 }
· iOS/Swift
서브스크립트는 콜렉션 타입(Array, Dictionary, Set), 시퀸스 등 집합의 인스턴스에서 특정 항목에 쉽게 접근할 수 있게 해주는 문법입니다. 우리가 평소에 자연스럽게 사용하던 배열 인스턴스의 특정 항목에 접근하기 위해 사용하는 someArray[index], Dictionary에서의 someDictionary[key] 과 같은 문법이 서브스크립트입니다. 서브스크립트를 통해 추가적인 메서드 필요없이 특정 값을 할당하거나 가져올 수 있습니다. 그리고 하나의 타입에 여러 서브스크립트를 정의하고, overload도 가능. 매개변수도 하나가 아니라 여러개를 받도록 정의할 수 있습니다. 서브스크립트의 작성 서브스크립트를 선언하는 방법은 계산프로퍼티를 선언하는 것과 유사합니다. subscript(ind..
SwiftyCody
'iOS/Swift' 카테고리의 글 목록 (3 Page)