본문 바로가기

Ios/Swift UI12

프로퍼티 초기화 중에 다른 인스턴스 멤버를 직접 참조할 수 없습니다. 간단히 테스트 하려고 코드를 가운데 3줄 집어넣었어요. 이 코드는 동작할까요...?!import SwiftUIstruct ProfileEditor: View { @Binding var profile : Profile var dateRange : ClosedRange{ let min = Calendar.current.date(byAdding: .year, value: -1, to: profile.goalDate)! let max = Calendar.current.date(byAdding: .year, value: 1, to: profile.goalDate)! return min...max } var today = Date() var seven.. 2024. 7. 26.
CloseRange - ClosedRange는 가장 기본적인 범위 타입이다. - 원래는 이 타입이름 ( CloseRange )를 그대로 쓰지 않고 범위 오퍼베이터 ( ..., .. * 1 ... 10 : 1이상 10이하* 1..  위의 표현식은 실제로 다음과 같은 ClosedRange 라는 타입으로 생성된다. * ( 1...10 ).lowerBound // 1* ( 1...10 ).upperBound // 10* ( 1...10).count // 10* (1...10).isEmpty // false 예를 들어서 다음과 같이var testRange : ClosedRange = 1...10// 이렇게 범위 비교를 할 수도(1...10).contains(8) // true1...10 ~= 8 // true// 위 두 코드는 같은.. 2024. 7. 26.
부모뷰에서 자식뷰로 상태를 바인딩해서 전달할 때 : $ 보면 ProfileEditor라는 자식 뷰가 있다. 여기서는 부모에게 Profile 자료형의 어떤 바인딩 상태를 받을 건데, 이걸 어떻게 주냐struct ProfileEditor: View { @EnvironmentObject var displayMode : DarkMode @State private var counter = 0 // 부모뷰로부터 profile을 전달받음 @Binding var profile : Profile .. . . . . .}  자식이 @Binding 된 속성을 요구하고 있기 때문에 이 ProfileEditor라는 자식 뷰의 부모뷰인 ProfileHost는 해당 뷰가 가지고 있는 Profile 자료형의 @Binding 을.. 2024. 7. 26.
@State, @Binding, @ObservedObject Property Wrapper는 감싸고 있는 속성에 변화가 생기면 해당 값을 읽거나, 아님 읽고 어떤 동작을 하거나, 아니면 새로 쓸 수 있는 녀석들이다. @State는 뷰 내부에서 상태를 관리하기 위해 사용된다.- 상태가 변경되면 뷰가 다시 렌더링 된다.- State 변수값이 변경되면 뷰를 다시 렌더링한다. 그렇기 때문에 항상 UI에서 보여주는 state는 최신 값이다.- @State 속성으로 어떤 프로퍼티의 초기값을 지정했다면, 다른 값으로 재할당 할 수 없다. @Binding 변수를 통해서만 가능하다.    ㄴ 개인적으로 이 말이 잘 이해가 안가서 하단에서 좀 자세히 다뤄볼게요.    ㄴ 이건, 약간 설명이 애매모호해요.    ㄴ 결론적으로 변경이 가능합니다. 근데, 다른 @State로 값을 재할당.. 2024. 7. 26.
@Environment @Environment- 프로퍼티 Wrapper 이다. ( 프로퍼티 감싸는 놈 )     ㄴ 그렇기 때문에 값을 꺼내서 쓰려면 ?.wrappedValue 로 꺼내야 한다.- 다른 뷰에서 @Environment 프로토콜을 채택한 프로퍼티가 있으면 그걸 갖다가 가져다 쓰는 해당 뷰의 UI 갱신 여부와 엮을 수 있다.    ㄴ 마치 Redux의 전역 변수 같은 느낌이다.   어떻게 쓸까? * https://seons-dev.tistory.com/entry/SwiftUI-Environment-%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0-%EB%9E%98%ED%8D%BC 참고  1. 먼저 환경 키를 생성한다. 예를 들어서 이렇게 캡션 컬러키를 Environment 변수로 만들고 싶다면 다음과.. 2024. 7. 26.
Swift UI 메서드 정리 ( 계속 추가 ) 1. resizable()- 이미지를 재조정할 수 있게 한다. - 원본의 크기를 무시하고 뷰의 크기에 맞게 조정할 수 있다. import SwiftUIstruct ContentView: View { var body: some View { Image("exampleImage") // 이미지 이름 .resizable() // 이미지를 재조정할 수 있게 함 .aspectRatio(contentMode: .fit) // 뷰의 비율을 유지하면서 맞춤 .frame(width: 100, height: 100) // 프레임 크기 설정 }}  2. scaledToFill()- 이미지가 뷰의 프레임을 채우도록 크기를 조정한다.- 뷰의 크기를.. 2024. 7. 24.
이것저것 Swift 메모용(찾아갈만한게 있을 수도 있고 없을 수도 있어요) Rangeimport Foundationlet range : Range = 0.0.. 0.0 .. 0.0 ... 5.0 은 0.0 이상 5.0 이하    구조체가 Hashable 프로토콜을 채택하는 경우- Hashable 프로토콜은 구조체나 클래스가 해시값을 가질 수 있도록 해주는 프로토콜- 해시 값은 특정 객체를 빠르게 찾거나 비교할 때 사용하는데, Hashable을 채택한 구조체는 Set이나 Dictionary 같은 컬렉션에서 키로 사용할 수 있게 된다.    Identifiable 프로토콜- 객체를 고유하게 식별할 수 있도록 해주는 프로토콜- 이 프로토콜을 채택하면 객체마다 고유한 식별자를 가지게 되어, 컬렉션이나 리스트에서 특정 객체를 쉽게 찾거나 업데이트할 수 있다. 주요 조건은 다음과 같다.1.. 2024. 7. 23.
@Environment로 커스템 데이터모델을 환경에서 가져오기 ModelData 라는 데이터 모델이 있다고 가정하고 이를 Swift UI의 환경에 주입한 후, 뷰에서 이것을 사용해보기! 1. 데이터 모델 정의 먼저, ModelData라는 간단한 데이터 모델을 정의합니다.import Foundationimport Combineclass ModelData : ObservableObject{ @Published var someData : String = "Initial Data"} - @Published는 데이터 모델의 특정 속성이 변경될 때, 이를 자동으로 알리고, 그 변화를 구독하는 모든 뷰를 업데이트합니다.   2. 데이터 모델을 환경에 주입합니다. Swift UI 앱의 진입점에서 데이터 모델을 환경에 추가합니다.import SwiftUI@mainstruct Exa.. 2024. 7. 22.
@Binding 과 .constant에 대해서 알아봅시다 * 오늘도 마찬가지로 여전히 Swift 생초보입니다.* Blazor라는 걸 공부하다가 왔는데 으우 너무 스트레스 받았어요. Swift UI Tutorial 3 : 사용자 입력처리를 보는데 다음과 같은 코드가 나옵니다.  import SwiftUIstruct FavoriteButton: View { @Binding var isSet : Bool var body: some View { Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) }}#Preview { FavoriteButton(isSet: .constant(true))} 이런 코드인데, 몇가지 생소한 표현이 보입니다. - 1. @Binding ( .. 2024. 7. 22.
키 패스 KeyPath 에 대해 알아봅시다 * Swift 배운지 얼마되지 않았습니다. 양해바랍니다 :)  - Swift / SwiftUI를 배우다보면 다른 언어에서 볼 수 없는 것들이 많은 것 같습니다.- 그러다보니 좀 생소한 표현법들이 많은 것 같아요.- KeyPath도 좀 그런 느낌이긴한데... \. 는 Swift의 KeyPath를 나타내는 문법입니다.- 타입 안전한 방식으로 객체의 속성에 접근할 수 있게 해줍니다. 그럼 예시코드를 살펴보겠습니다. import SwiftUIstruct ContentView : View{ @Environment( /.layoutDirection ) var layoutDirection : LayoutDirection var body : some View{ Text(layoutDirection .. 2024. 7. 19.