분류 전체보기

    [에러와의 동침] 22년 11월 4주차

    22.11.21 json에 존재하는 key, value를 struct에서 정의하지 않을 경우에는 정상적으로 Decoding 반대로 json에 존재하지 않는 key, value를 struct에서 정의하는 경우에는 KeyNotFound Error가 발생 특정 value에 key-value가 부분적으로 존재할 때는 Optional을 적용 만약, key-value를 제대로 정의했는데 KeyNotFound Error가 발생하면 특정 key-value가 부분적으로 존재하는지 확인할 것 22.11.22 json에는 id가 없지만 identifiable을 만족시키기 위해 uuid를 넣어주는 경우 var이 아닌 let으로 선언 EnvironmentObject를 사용할 때, 최상단에서 인스턴스를 넣어주기에 뷰의 게층 구조..

    [iOS / SwiftUI] 스크롤, 무한으로 즐겨요~ (LazyVStack으로 무한 스크롤 구현하기)

    오늘은 ScrollView와 LazyVStack을 활용하여 SwiftUI에서 무한 스크롤을 구현해보려고 한다. 사실, LazyVStack이 조금 생소할 수 있다. LazyVStack은 말 그대로 Lazy하게 VStack을 그린다는 느낌으로, VStack으로 보여줄 항목이 실제로 UI에 보여질 때 렌더링을 진행하는 View이다. Apple Developer Documentation developer.apple.com 그렇다면 기존에 사용하던 VStack과는 어떤 차이가 있을까? 평소에 사용하던 VStack은 뷰가 보여질 때(onAppear) 모든 항목을 렌더링한다. 그렇기에 ScrollView + VStack 조합으로 List를 나타낸다면 초기에 많은 리소스를 소모하게 된다. 적은 개수의 간단한 항목들을 ..

    "let us: Go! 2022 Fall"에 다녀왔습니다!

    두근두근 렛어스고! 👋 지난 주에 렛어스고에 다녀왔다. 11월 5일에 다녀왔지만! 지금 회고를 쓰고 있다. 원래 회고는 일주일 뒤에 쓰는게 국룰! 😋 우선 렛어스고는 지금 하고 있는 멋사 앱스쿨에서 한 분이 정보를 공유해주셔서 알게 됐고, 운 좋게 티켓팅에 성공해서 참가하게 됐다. 티켓은 학생 티켓과 일반 티켓이 있다. 학생 티켓이 훨씬 저렴하지만 수량이 적어서, 학생 티켓 예매에는 실패했고 일반 티켓을 예매했다! 버스를 타고 서울까지 가야하는 상황이라 조금 고민이 많았지만, 그래도 iOS 세미나를 참가해보고 싶어서 아침 일찍 서울을 향했다. 발표 장소는 코엑스 앞에 있는 Finda였다. 30분 정도 일찍 도착했더니 운영진을 제외하고는 거의 없었다. 뒤에 계신 분과 얘기를 나눌까했지만 같이 오신 분이 있..

    [iOS / Swift] Swift 문자열 정복하기 (aka 'Character')

    이 글은 PC버전에 최적화되어 있습니다. 높은 해상도의 모니터에서는 우측에 TOC가 표시됩니다. Swift로 문자열 문제를 풀다보면 오류를 자주 접하게 된다. (error: cannot convert value of type 'String.Element' (aka 'Character') to closure result type 'String) '이게 왜 안됨? ㅋㅋ' 라는 생각이 들 정도로 안된다. 아무튼 이런 오류를 자주 접했기에 글로 정리하면서 다시 한 번 복습하려고 한다. 1. 문자열 형 변환하기 1. String -> Int 다른 언어에서처럼 Int()로 형 변환을 진행한다. 이 때, String인지 SubString인지 Character인지 잘 살펴본다. (그렇지 않으면... error: can..

    [iOS / SwiftUI] 다양한 상태 프로퍼티들을 알아보자!

    State와 Binding 지난 시간 @State와 @Binding 프로퍼티 래퍼에 대해 학습했다. 1. @State @State 프로퍼티 래퍼를 사용해서 상태 프로퍼티를 작성하면 해당 프로퍼티가 선언된 뷰와 바인딩할 수 있게 된다. 좀 더 쉽게 설명하자면 뷰와 바인딩이 되어 있는 상태프로퍼티에 변경이 일어나면 자동으로 뷰가 갱신된다는 말이다. 코드로 직접 살펴보자. 아래 코드는 버튼을 클릭하면 숫자가 1씩 증가하도록 구현한 앱이다. struct ContentView: View { @State private var number: Int = 0 var body: some View { VStack { Text("\(self.number)") Button(action: { self.number += 1 }) ..

    [iOS / SwiftUI] 키보드가 사라지지 않아요...😩

    SwiftUI Keyboard Dismiss 어제 구현한 팀 과제를 다시 한 번 구현하던 도중에 추가해보고 싶은 기능이 있었다. 사용자 입력을 소프트 키보드 혹은 버튼을 통해서 입력 받는데, 소프트 키보드로 입력 받은 경우에 Submit을 누르지 않고, 뷰의 클릭하더라도 소프트 키보드가 닫히도록 구현하고 싶었다. 1. Focused 우선 이 기능은 SwiftUI 3.0 (iOS 15) 이상부터 지원한다. 그런 탓인가 정말 간단하게 구현이 가능하다. var body: some View { @State private var input: String = "" @FocusState private var isFocused: Bool // 생략... VStack { TextField("PlaceHolder", $i..

    [iOS / SwiftUI] ForEach로 View를 리펙토링 해볼까요?

    Swift UI에서 ForEach로 View 여러 개 오늘 스터디에서 날씨를 보여주는 페이지를 Swift UI로 구현하는 과제를 진행했다. HStack과 VStack을 활용해서 구현하는 과제였고 구현 결과는 아래와 같다. 하지만 구현을 완료하고 보니 대부분이 하드 코딩되어 있어서 겹치는 코드들이 많아 이를 수정해주는 작업을 진행했다. 아래 사진을 보면 빨간색 뷰 안에 초록색 뷰들이 같은 형태로 배치되어 있는 것을 볼 수 있다. 기존에는 HStack 내부에 VStack을 여러 개 배치하는 방식으로 구현했는데, 이를 ForEach를 활용해서 VStack을 재사용하는 방식으로 수정했다. 1. 기존 코드 struct DailyHourWeatherView: View { var body: some View { HS..

    [iOS / Swift] lim 클로저 -> 0 (클로저, 극한으로 줄여보기)

    지난 시간에 개인적으로 클로저에 대해서 좀 더 알아봤는데 오늘 강의에서는 클로저에 대한 진도를 나갔다. 복습 차원에서 강의를 들으면서 다시 한 번 정리해봤다. 클로저 클로저는 기능을 갖고 있는 코드 블록이다. 클로저에서는 상수와 변수에 대한 참조를 캡쳐하고 저장할 수 있으며 크게 3가지로 구분한다. 전역 함수 중첩 함수 클로저 표현식 1. 전역 함수 첫 번째로 전역함수는 우리가 프로그래밍을 하면서 정의하고 호출하는 함수들이다. func 키워드를 통해 정의한다. 전역함수는 이름을 가지고 있고 어떠한 값도 캡쳐하지 않는 클로저이다. func justFunction() -> String { return "KODO" } 2. 중첩 함수 두 번째로 중첩 함수는 이름을 가지고 둘러싼 함수로부터 값을 캡쳐할 수 있는..

    [iOS / Swift] 클로저와 프로퍼티, 가볍게 알아보기

    클로저 클로저는 다양한 형태로 표현이 가능하다. 후행 클로저 : 함수의 마지막 매개변수로 전달되는 클로저는 후행클로저로, 함수 밖에 구현될 수 있다. 반환 타입 생략 : 컴파일러가 클로저의 반환 타입을 유추할 수 있는 경우, 반환 타입을 생략할 수 있다. 매개변수 이름 생략 : 매개변수의 이름이 필요 없고, 컴파일로가 타입을 유추할 수 있는 경우, 축약된 전달 인자 형태로 사용할 수 있다. 암시적 반환 : 반환 값이 있는 경우, 클로저의 맨 마지막 줄에서 return을 생략할 수 있다. 1. 반환 타입 생략 calculate 함수의 method 매개변수는 Int형이 반환된다는 것을 컴파일러도 알고 있기에 클로져에서 반환 타입을 명시해주지 않아도 된다. 하지만 in 키워드는 생략할 수 없다. let res..

    [iOS / Swift] 상속 VS 익스텐션

    익스텐션 스위프트의 강력한 기능으로, 구조체, 클래스, 열거형, 프로토콜 타입에 새로운 기능을 추가할 수 있게 해준다. 기능을 추가하려는 타입의 구현된 소스 코드를 알지 못하더라도 타입만 알고 있다면 기능을 확장할 수 있다. 익스텐션으로 타입에 추가할 수 있는 것들에는 연산 타입 프로퍼티 / 연산 인스턴스 프로퍼티 타입 메서드 / 인스턴스 메서드 초기화 서브스크립트 중첩 타입 특정 프로토콜을 준수할 수 있도록 기능 추가 새로운 기능을 추가할 수는 있지만 기존에 존재하는 기능을 재정의(override)는 불가능하다. 이것이 바로 상속과의 차이이다. 상속 VS 익스텐션 상속 - 클래스 타입에 활용 - 수직적으로 확장 - 재정의 가능 익스텐션 - 클래스, 구조체, 열거형, 프로토콜 등 모든 타입에 활용 - 수..