User를 filter하여 특정 사용자만 보이게 하거나, sort하여 순서를 조정하여 보여줄 수도 있다.
먼저 UsersView를 만들어 List에서 user들을 나열한다. 그리고 users는 initializer를 통해 정의한다.
init(minimumJoinDate: Date) {
_users = Query(filter: #Predicate<User> { user in
user.joinDate >= minimumJoinDate
}, sort: \User.name)
}
모두를 보이게 하거나, 앞으로 가입할 사용자를 보이게 하기 위해
1. isShowingUpcoming
변수를 만들어 ContentView의 toolbar에 버튼을 만들어 선택하게 한다.
2. 그리고 UsersView를 불러올 때 joinDate 인수를 isShowingUpcoming
에 따라 달리 설정한다.
UsersView(minimumJoinDate: isShowingUpcoming ? .now : .distantPast)
추가로 users를 sort하려면,
1. 마찬가지로 ContentView에서 SortDescriptor의 배열인 변수 sortOrder
를 만든다.
2. toolbar의 Picker로 선택하는 것에 따라 User의 name 혹은 joinDate를 우선시하여 sortOrder
업데이트 한다.
3. UsersView의 initializer에 sortOrder라는 매개변수를 추가하고, UsersView를 불러올 때 sortOrder를 인수로 전달한다.
init(minimumJoinDate: Date, sortOrder: [SortDescriptor<User>]) {
_users = Query(filter: #Predicate<User> { user in
user.joinDate >= minimumJoinDate
}, sort: sortOrder)
}
}
사용자의 직업 정보를 저장할 수 있는 model Job
을 만들었다.
@Model
class Job {
var name: String
var priority: Int
var owner: User?
init(name: String, priority: Int, owner: User? = nil) {
self.name = name
self.priority = priority
self.owner = nil
}
}
그리고 User
는 Job의 배열 jobs를 가진다.
@Model
class User {
var name: String
var city: String
var joinDate: Date
var jobs = [Job]()
init(name: String, city: String, joinDate: Date) {
self.name = name
self.city = city
self.joinDate = joinDate
}
}
Job이라는 인스턴스를 만들고, User에 추가해서 이 두 model을 연결하고, User가 삭제될 때 만들어진 Job이라는 인스턴스도 사라지게 하려면 User class를 아래처럼 설정하면 된다.
@Relationship(deleteRule: .cascade) var jobs = [Job]()
그저 User의 인스턴스에 Job 인스턴스를 추가하는 것으로도 두 model을 연결할 수 있다. SwiftData는 User의 인스턴스를 지운다고 해서 연관된 Job 인스턴스를 자동적으로 지우지 않는다.
func addSample() {
let user1 = User(name: "Piper Chapman", city: "New York", joinDate: .now)
let job1 = Job(name: "Organize sock drawer", priority: 3)
let job2 = Job(name: "Make plans with Alex", priority: 4)
modelContext.insert(user1)
user1.jobs.append(job1)
user1.jobs.append(job2)
}
Adding capabilities to your app
Configuring iCloud services
공식 문서대로 Project > Target > Signing & Capabilities > + Capability에서 icloud를 추가하면 된다.
❗️Cloudkit을 이용하려면 애플 개발자 계정이 필요하다.
추가로 icloud에서 데이터가 변경될 때 알림을 전송할 수 있도록 Background mode도 같은 방법으로 추가한다.
마지막으로 icloud에 저장하는 SwiftData는 모든 속성의 초기값을 설정하거나 optional이어야 한다.
이렇게 하면 기존 코드 변경 없이 icloud와 동기화할 수 있다.