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

Min*_*int 5 swift swiftui

正如你可以在看到官方教程项目,有这个奇怪的@EnvironmentObject安置之前var。这是什么意思?

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

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

jsb*_*eJS 12

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

例如这种情况:

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)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

测试版5:

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
    // @EnviromentObject var networkManager: NetworkManager // Don't forget to instaniate it with .enviromentObject()

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

            List(networkManager.courses, id: \.name) {
                Text($0.name)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您需要通过apple导入Combine一个新框架 (2认同)