gpt4 book ai didi

ios - SwiftUI 中的属性 `@EnvironmentObject` 是什么意思?

转载 作者:搜寻专家 更新时间:2023-10-30 22:30:15 24 4
gpt4 key购买 nike

正如您在 official tutorial project 中看到的那样,在 var 之前放置了这个奇怪的 @EnvironmentObject。什么意思?

struct LandmarkDetail: View {
@EnvironmentObject var userData: UserData
var landmark: Landmark

var landmarkIndex: Int {
userData.landmarks.firstIndex(where: { $0.id == landmark.id })!
}
// ...
}

最佳答案

例如,这是出于网络目的。您有一个符合 BindableObject(Beta 5:ObservableObject)的类并通过 PassthroughSubject(Beta 5:@Published) 你的数据。

例如这个案例:

SwiftUI (1.0)

struct Course: Decodable {
let name: String
}

class NetworkManager: ObservableObject {

@Published var courses = [Course]()

func getAllCourses() {
guard let url = URL(string: "https://api.letsbuildthatapp.com/jsondecodable/courses") else { return }
URLSession.shared.dataTask(with: url) { (data, response, error) in
do {
let courses = try JSONDecoder().decode([Course].self, from: data!)
DispatchQueue.main.async {
self.courses = courses
}
} catch {
print("Failed To decode: ", error)
}
}.resume() // VERY IMPORTANT! As the request won't run
}
}

struct ContentView : View {
@ObservedObject var networkManager: NetworkManager = NetworkManager()
// Or this
// @EnvironmentObject var networkManager: NetworkManager // Don't forget to instaniate it with .environmentObject()

var body: some View {
VStack {
Button(action: {
self.networkManager.getAllCourses()
}, label: {
Text("Get All Courses")
})

List(networkManager.courses, id: \.name) {
Text($0.name)
}
}
}
}

测试版

struct Course: Decodable {
let name: String
}

class NetworkManager: BindableObject {
let didChange = PassthroughSubject<NetworkManager, Never>()

var courses = [Course]() {
didSet {
didChange.send(self)
}
}

func getAllCourses() {
guard let url = URL(string: "https://api.letsbuildthatapp.com/jsondecodable/courses") else { return }
URLSession.shared.dataTask(with: url) { (data, response, error) in
do {
let courses = try JSONDecoder().decode([Course].self, from: data!)
DispatchQueue.main.async {
self.courses = courses
}
} catch {
print("Failed To decode: ", error)
}
}.resume() // VERY IMPORTANT! As the request won't run
}
}

struct ContentView : View {
@EnvironmentObject var networkManager: NetworkManager

var body: some View {
VStack {
Button(action: {
self.networkManager.getAllCourses()
}, label: {
Text("Get All Courses")
})

List(networkManager.courses.identified(by: \.name)) {
Text($0.name)
}
}
}
}

关于ios - SwiftUI 中的属性 `@EnvironmentObject` 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56437035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com