iOS 개발 (28) 썸네일형 리스트형 [iOS/SwiftUI] 기초적인 Navigation 구현하기 NavigationView 사용하기 var body: some View { NavigationView { List(artworks) { artwork in // Add views to the navigation stack with NavigationLink. NavigationLink( destination: DetailView(artwork: artwork), label: { Text(artwork.title) }) } .listStyle(PlainListStyle()) // Notice that this modifier is for List. (Not NavigationView.) .navigationBarTitle("Artworks") } } Bool 변수를 toggle 해서 sheet 띄우기 Bo.. [iOS/SwiftUI] ForEach 로 View 반복하기 (Identifiable protocol) Static View vs. Dynamic View Static View 는 SwiftUI 의 View 컴포넌트들을 하드 코드 해서 만드는 View 를 말한다. VStack 안에 TextField, Button 등을 작성한 View 를 예로 들 수 있다. Dynamic View 는 List 혹은 ForEach 를 통해 다수의 View 를 만드는 방식이다. View 를 추가, 제거 시에 몇 번째 View 에 생긴 변화인지 파악해야 하므로 각각을 구별할 수 있는 식별자(identifier) 가 필요하다. 식별자란 유일하게 혼자만 가지는 정보로, 하나의 식별자에 대해 하나의 대상만 존재하기 때문에 이를 통해 어떤 Item(View) 인지 파악할 수 있다. Identifiable protocol Identifi.. [iOS/Swift] KeyPath KeyPath 프로퍼티를 실제로 불러오거나 정보를 읽지 않은 채로 그 자체를 참조만 할 수 있게 한다. struct Person{ var socialSecurityNumber: String var name: String } let atj = Person(socialSecurityNumber: "13-2432-21", name: "TaeJeong") let nameKeyPath = \Person.name let SSNKeyPath = \Person.socialSecurityNumber print(atj[keyPath: nameKeyPath]) print(atj[keyPath: SSNKeyPath]) KeyPath 활용하기 Identifiable 프로토콜을 사용할 때 객체마다 상이한 identifier 의 .. [iOS/SwiftUI] State & Binding @State View 는 앱의 상태를 나타내고 Data 는 그 상태의 정보를 가진다. Data 가 바뀌면 View 는 그 변경 사항을 반영해야 하는데, View 는 값 타입 (Value type) 이므로 변경 사항을 반영하지 않는다. (modifier 를 사용할 때도 변경 사항의 반영된 새로운 View 를 반환 받는 것이다.) 따라서, View 의 상태를 변경 가능한 타입으로 메모리에 두고 Data 가 변경될 때마다 View 를 갱신 (Re-render) 하도록 해야한다. @State 를 프로퍼티 앞에 사용하면 해당 프로퍼티의 변경에 대해서 View 는 Re-render 될 수 있다. Binding Data 의 Binding 을 받아서 동작하는 컴포넌트들이 있다. Binding 을 받는 것은 실제 Dat.. [iOS/Swift] Optional type, guard let vs. if let Optional type 어떤 변수가 Optional type 이라면 어떤 값을 가지거나 nil 값을 가질 수 있다. nil 은 값이 없다는 뜻이다. Optional 변수를 사용할 때는 Optional 을 해제한 뒤 사용할 수 있고, 그 값이 nil 인 경우는 해제할 수 없다. 아래의 Optional binding 을 통해 안전하게 옵셔널 값을 해제할 수 있다. Optional binding Optional 표현식을 평가한다. nil 이 아닌 경우 Optional 해제된 값을 저장하고 true 를 반환한다. nil 인 경우 false 를 반환한다. 아래 두 가지 방법이 있다. 1. if let Optional 변수를 평가해 nil 이 아닌 경우 선언된 상수에 값을 저장하고, 기존 Optional 변수는 .. [iOS] 어떤 클로저에 [weak self] 해야 할까? 이전 포스팅을 통해 강한 참조 순환이 생기는 이유와 해결 방법을 알아보았다. 특히 클로저와 클래스 인스턴스 사이에 생기는 참조 순환은 일상적으로 발견하기 쉬운데 self 를 캡처하는 모든 클로저가 메모리 누수를 일으키는 것은 아니다. 이번 포스팅을 통해 어떤 클로저가 실제 메모리 누수를 일으키는지, 따라서 [weak self] 를 작성해야 하는지 확인해보자. non-escaping vs. escaping 클로저 클로저에는 크게 두 가지 분류가 있는데, 이름에서 알 수 있듯 어딘가로 탈출할 것 같은 클로저와 그렇지 않은 클로저이다. non-escaping 클로저 어디 가지 않고 있을 것 같은 이름의 클로저 즉, 선언되는 즉시 실행된다. 프로퍼티에 저장되거나 추후에 실행되거나 하는 일이 없다. 컴파일러는 n.. [iOS] 강한 참조 순환(Retain Cycle), 참조 순환 해결하기 Swift Document - Automatic Reference Counting 클래스 객체 간의 강한 참조 순환 (Strong Reference Cycle, Retain Cycle) 두 객체가 서로에 대한 참조를 멤버로 가진 상태에서 각 객체에 대한 참조가 모두 할당 해제 되어도 서로를 참조하는 멤버의 참조는 여전히 유효하기 때문에 접근하지도 못하는 두 객체가 메모리에 남아있게 되는 메모리 누수 현상이다. 두 객체가 메모리에 남는 이유는 Swift 의 ARC 즉, 자동 참조 카운트 때문인데 Swift 는 어떤 객체가 누군가에 의해 참조되고 있음을 카운팅하고 이것이 0 이 되었을 때 메모리에서 해제한다. 따라서 두 객체의 멤버가 서로를 참조하기 때문에 메모리에서 해제되지 않는다. 객체 간의 참조 순환 .. [iOS/UIKit] Animation 효과로 ViewController 전환하기 ViewController 전환을 Animate 시킬 때 생각해야 할 것 ? Animation 을 통해 ViewController 를 전환하려는 목적을 잘 생각해보자. 많은 경우에, 전환되는 화면들의 관계성을 사용자가 잘 이해하도록 보여주기 위함이다. 예를 들어, 아이폰의 달력 앱에서 열두 달이 놓여 있을 때 특정 달을 누르면 전체 화면이 해당 달 위치로 좁혀 들어가며 해당 달의 날짜들이 확대되어 보이는 화면으로 전환된다. 이런 방식의 화면 전환은 사용자가 한 해의 전체 달 중 어떤 특정한 달의 정보를 얻기 위해 이동했다는 가시적인 이해를 제공하여 앱을 사용하는 어떤 목적과 과정에 대해 현재 어느 부분에 위치해 있다는 느낌을 줄 수 있다. View 전환을 준비하기 위한 질문들 어떤 View 가 Anima.. 이전 1 2 3 4 다음