iOS 개발/SwiftUI

    [SwiftUI] @escaping에 대해서

    [SwiftUI] @escaping에 대해서

    SwiftUI를 이용해서 코딩을 하다보면, 종종 @escaping 이라는 키워드를 만나게 됩니다. 기본적인 형태는 이렇습니다. func functionWithEscaping(completion: @escaping () -> Void) { completion() } 우리가 흔히 Escaping이라는 단어를 들으면, 어딘가로 탈출하는 모습이 그려지죠? 실제로 Escaping Closure는 해당 로직 밖에서 사용이 가능합니다. 즉, 현재 있는 함수 외부 다른 곳에서 호출이 가능하게 됩니다. 예시를 들어볼까요? 이렇게 () -> Void 형태의 함수를 저장하는 배열이 있다고 할게요. var completionHandlers: [() -> Void] = [] 이 배열에, 원하는 함수를 인자로 받아서 append..

    [SwiftUI] inout은 어떻게 작동하는가 (C언어의 Call by Reference와 비교)

    [SwiftUI] inout은 어떻게 작동하는가 (C언어의 Call by Reference와 비교)

    Generics 함수를 공부하던 중, inout이 어떻게 작동하는지 궁금해져서 한번 주솟값들을 찍어봤습니다. swift에서 inout은 C언어의 Call by Reference와 똑같이 작동할까요? 먼저 C언어에서 Call by Reference를 살펴볼게요 #include void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } int main(void) { int a = 42; int b = 21; swap(&a, &b); } C에서는 pointer를 사용하여, 주솟값을 함수로 넘겨줍니다. 그리고 이 주솟값 안의 변수를 복사하고 수정하는 등의 작업을 손쉽게 처리할 수 있습니다. 이렇게 실제로 주솟값을 보내서 해당 주솟값이 가리키는 ..

    [SwiftUI] Generics 타입 제약 (Type Constraints) 다루기

    [SwiftUI] Generics 타입 제약 (Type Constraints) 다루기

    Generics 함수의 타입매개변수에는 특별한 제약을 걸어주지 않으면 어떤 타입도 들어올 수 있습니다ㅎㅎ 하지만, 아무 타입이나 들어왔을 때 문제가 생기는 경우가 있습니다. 바로 우리의 함수 내부 로직이 특정 성격을 가지는 타입을 다룰 때인데요! 공식문서의 예시를 들어볼게요! 배열에서 문자열을 찾는 함수입니다. 예를들어 ["aa", "bc", "de", "fgh"] 이런 배열이 있을 때, "bc"를 검색한다면 해당 index값인 1을 반환하고, "a"를 검색하면 일치하는 문자열이 존재하지 않기 때문에 nil을 반환하는 함수이죠! func findStringIndex(array: [String], valueToFind: String) -> Int? { for (index, value) in array.en..

    [SwiftUI] ForEach에서 \.self를 사용하는 이유와 id 중복 문제 해결 방법

    [SwiftUI] ForEach에서 \.self를 사용하는 이유와 id 중복 문제 해결 방법

    SwiftUI에서 ForEach는 Array 등 컬렉션 자료형을 순환하며 View를 생성해주는 역할을 합니다. 하지만, 사용법이 다르고 매개변수로 id가 존재하는 등 기존의 forEach와 다른 점이 많아 보입니다. SwiftUI의 ForEach에 대해서 이해하기 위해서는 먼저 SwiftUI에서 사용하는 ForEach는 기존의 반복문, 즉 Swift의 forEach()과는 비슷하게 작동하지만 본질적으로 다르다는 점을 먼저 알아야 합니다. 공식 문서를 보면, Apple Developer Documentation developer.apple.com ForEach는 '식별된' 데이터들의 컬렉션에 따라, 'View'를 계산하는 구조체입니다. 기존의 swift의 forEach()가 컬렉션 내부의 요소들을 하나씩 ..

    [SwiftUI] json parsing 방법

    [SwiftUI] json parsing 방법

    swift UI에서 json parsing은 정말 간단하고, 똑똑? 위험? 한 것 같다는 생각을 했습니다. 어떤 json 파일을 struct array에 parsing하려고 한다고 했을 때, json 파일의 구성은 다음과 같습니다. 먼저 파일 이름은 landMarkData.json 입니다. { "name": "Turtle Rock", "category": "Rivers", "city": "Twentynine Palms", "state": "California", "id": 1001, "isFeatured": true, "isFavorite": true, "park": "Joshua Tree National Park", "coordinates": { "longitude": -116.166868, "lati..

    [SwiftUI] View 가독성을 늘리는 3가지 방법 (View 쪼개기)

    [SwiftUI] View 가독성을 늘리는 3가지 방법 (View 쪼개기)

    SwiftUI 프레임워크를 사용하면서, UIKit 프레임워크를 사용할 때 ViewController가 어마무시하게 길어지는 문제를 해결했지만, View를 코딩할 때, 가독성을 고려하는 건 여전히 중요한 문제라고 생각합니다. 다음은 같이 카드 몇개를 보여주는 간단한 작업인데 코드가 매우 복잡하죠?? 이렇게 코드를 무조건 늘여놓게 되면 읽기도 힘들고, 유지보수 하기에도 상당히 애를 먹게 될거에요. struct ContentView: View { @State var cards = ["♠️", "♣️", "♥️", "♦️"] let cardShape = RoundedRectangle(cornerRadius: 20) var body: some View { VStack { Text("Card Game") .font..

    [SwiftUI] View protocol과 body 변수에 대한 고찰 (some 키워드를 사용하는 이유)

    [SwiftUI] View protocol과 body 변수에 대한 고찰 (some 키워드를 사용하는 이유)

    우리가 SwiftUI로 UI를 그릴 때마다, 반드시! 마주치는 프로토콜과 변수가 있죠!! 바로 View와 body입니다. 이렇게 어떤 View를 사용자 정의 생성하기 위해서는 body라는 변수가 반드시 필요하죠!! struct MyView: View { var body: some View { ... } } 여기서 body가 채택한 프로토콜인 View 옆에 some 키워드를 붙여주는 이유는 무엇일까요?? 이를 이해하기 위해서는 body라는 변수의 특성과, View 프로토콜과의 관계에 대해서 이해하면 확실하게 이해가 가능합니다. 더불어 some 키워드의 활용법도 완전히 이해하실 수 있을거에요!! 우리가 View를 사용하기 위해서는 MyView 오른쪽에 있는 저 View 프로토콜을 채택해야만 하는데요! Swi..

    [Swift UI] @State에 대한 아주 얕은 고찰

    [Swift UI] @State에 대한 아주 얕은 고찰

    @State는 구조체 내부의 값을 변경할 수 있도록 해주는 역할을 합니다. 기본적으로 우리는 struct가 한번 생성되면, 내부에서 값을 바로 변경할 수는 없었죠? C++과 같은 여러 객제지향 언어에서 구조체 안의 변수값을 변경해주 역할을 하는 함수를 mutating 키워드로 선언했던 기억을 떠올리면 쉬울 거에요! 근데 왜 mutating이 있는데, 굳이 변수 앞에 @State를 쓸까요? 답은 재참조에 있습니다!! mutating func으로 변경된 변수는 View가 destroy 되는 순간, 다시 초기값으로 돌아가게 됩니다ㅎㅎ 하지만 @State 변수의 경우 view가 destroy 된 이후에도 해당 값을 재참조한다는 차이점이 있습니다. 조금더 자세히 설명하자면 @State 키워드 변수는 실제로 값이 ..

    [SwiftUI] Swift UI에 대한 첫인상

    [SwiftUI] Swift UI에 대한 첫인상

    처음에 swiftUI를 접했을 때는 기존 UIKit에서 사용했던 viewcontroller가 없어서 처음에 정말 당황습니다. 아직 매우 기초적이지만ㅋㅋ 공부를 하면서 느낀 swift UI의 가장 큰 특징! 은 저장된 변수가 거의 없다는 것입니다. 그때 그때 원하는 매개변수를 struct에 넘겨 주어서 view를 구성한다는 것이 storyBoard와 가장 큰 차이인 것 같습니다. 즉, 기존에는 컨트롤러가 중앙에서 함수들을 관리하면서 변수들을 저장하고, 넘겨주고 이런 역할을 해주는데, swiftUI에서는 struct 하나가 view 하나의 레이아웃 구성과 함수들을 관리하기 때문에, view들이 독립적이라는 생각이 들었습니다. 이렇게 되면 데이터를 구조화하는게 매우 중요하고, sturct 구성을 깔끔하게 하는..