Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@laevandus
Last active November 3, 2020 02:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save laevandus/ef7a1f42d0d910947fe0102564a29fa0 to your computer and use it in GitHub Desktop.
Save laevandus/ef7a1f42d0d910947fe0102564a29fa0 to your computer and use it in GitHub Desktop.
// MARK: View
struct PackageKVOModelView: View {
@StateObject var viewModel: ViewModel
var body: some View {
Form {
TextField("First name", text: $viewModel.firstName)
Text(viewModel.modelDescription)
}
}
}
// MARK: Model
extension PackageKVOModelView {
final class Package: NSObject {
@objc dynamic var recipient = FullNameNSObject()
}
}
final class FullNameNSObject: NSObject {
@objc dynamic var firstName: String = "A"
@objc dynamic var lastName: String = "B"
}
// MARK: View Model
extension PackageKVOModelView {
final class ViewModel: ObservableObject {
private let package: Package
private var cancellables = [AnyCancellable]()
init(package: Package) {
self.package = package
// Model -> View Model
package.publisher(for: \.recipient.firstName).assign(to: &$firstName)
// View Model -> Model
$firstName.dropFirst().removeDuplicates().assign(to: \.recipient.firstName, on: package).store(in: &cancellables)
}
@Published var firstName: String = ""
var modelDescription: String {
return package.recipient.firstName + " " + package.recipient.lastName
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment