DEV Community

Lankinen
Lankinen

Posted on

CS193p Notes - Lecture 9: Data Flow

Property Wrappers

  • Property wrappers are things like @Publish that are put before var
  • A property wrapper actually creates a struct
@Published var emojiArt: EmojiArt = EmojiArt()

struct Published {
  var wrappedValue: EmojiArt
  var projectedValue: Publisher<EmojiArt, Never> 
}
var _emojiArt: Published = Published(wrappedValue: EmojiArt())
var emojiArt: EmojiArt {
  get { _emojiArt.wrappedValue }
  set { _emojiArt.wrappedValue = newValue }
}
  • Publisher<EmojiArt, Never> is a type that property wrapper decides
    • The point of wrappers is that it's possible to do something when the value is get/set
    • For example when Published wrapperValue is changed, it's calling objectWillChange.send()
  • $ is binding
  • Binding is used a lot and it's very important because it's all about having a single source of the truth
struct MyView: View {
  @State var myString = "Hello"
  var body: View {
    OtherView(sharedText: $myString)
  }
}
struct OtherView: View {
  @Binding var sharedText: String
  var body: View {
    Text(sharedText)
  }
}
  • @EnvironmentObject is similar to .fill() because when it's use in viewModel it's actually added to all of the views under neath the main View where it's called.

Publishers (18:17)

  • Publisher<Output, Failure>
    • Output is the type of thing this Publisher publishes
    • Failure is the type of thing it communicates if it fails while trying to publish

Demo

import Combine
...
  @Published private var emojiArt: EmojiArt
  private var autosaveCancellable: AnyCancellable?
...
  init() {
...
    autosaveCancellable = $emojiArt.sink { emojiArt in
      print("\(emojiArt.json?.utf8 ?? "nill")")
      UserDefaults.standard.set(emojiArt.json, forKey: EmojiArtDocument.untitled)
    }
...
  • When sink is stored to a variable, it's going to work as long as this ViewModel exists
    • This way it's auto saving all the changes as long as ViewModel is used

@RealLankinen

Originally published here

Top comments (0)