Swift3 简单代码swift到reactiveswift

Swift3 简单代码swift到reactiveswift,swift3,reactive-cocoa-5,reactive-swift,Swift3,Reactive Cocoa 5,Reactive Swift,了解如何转换代码: struct CarModel { var model: String? var make: String? var kilowatts: Int? var photoURL: String? init(model: String, make: String, kilowatts: Int, photoURL: String) { self.model = model self.make = make

了解如何转换代码:

struct CarModel {
    var model: String?
    var make: String?
    var kilowatts: Int?
    var photoURL: String?

    init(model: String, make: String, kilowatts: Int, photoURL: String) {
        self.model = model
        self.make = make
        self.kilowatts = kilowatts
        self.photoURL = photoURL
    }
} 
以及:

cocoa/ReactiveSwift。我念了一遍。关于Reactive的文档,但我不理解如何在代码中实现Reactive API。 谁知道我需要怎么做,请告诉我。
还有一位知道上一版本ReactiveCocoa/ReactiveSwift的好示例/示例/教程的人,请告诉我。

ReactiveCocoa用于将动态数据(保存在viewmodel中)绑定到ViewController的UI。如果数据不是动态的(如果viewmodel在viewcontroller的生命周期内没有更改),则根本不需要使用reactivecocoa。但是,如果您的
car
变量将发生变化,并且一个viewcontroller将用于显示多辆车,那么reactivecocoa将非常有用。您可以使用
MutableProperty
类来封装动态
car
变量,并创建在汽车属性更改时更新ViewController的信号

class CarViewModel {
  let car: MutableProperty<Car>

  init(_ car: Car) {
    self.car = MutableProperty(car)
  }

  var modelTextSignal: SignalProducer<String, NoError> {
    return car.producer.map { $0.model }
  }

  var makeTextSignal: SignalProducer<String, NoError> {
    return car.producer.map { $0.make }
  }

  var horsepowerTextSignal: SignalProducer<String, NoError> {
    return car.producer.map { car in
      let HP = Int(round(Double(car.kilowatts) * CarViewModel.HPperKW))
      return "\(HP) HP"
    }
  }

  var titleTextSignal: SignalProducer<String, NoError> {
    return car.producer.map {  "\($0.make) \($0.model)" }
  }

  var photoURLSignal: SignalProducer<URL?, NoError> {
    return car.producer.map { URL(string: $0.photoURL) }
  }
}
因此,您可以看到,如果只需要在视图控制器中显示一个不变的汽车对象,则无需使用ReactiveCocoa--但是,如果您的viewmodel在viewcontroller的整个生命周期中都在更改,reactivecocoa允许您将可变数据绑定到UI,以便在数据更改时自动更新视图

class CarViewModel {
  let car: MutableProperty<Car>

  init(_ car: Car) {
    self.car = MutableProperty(car)
  }

  var modelTextSignal: SignalProducer<String, NoError> {
    return car.producer.map { $0.model }
  }

  var makeTextSignal: SignalProducer<String, NoError> {
    return car.producer.map { $0.make }
  }

  var horsepowerTextSignal: SignalProducer<String, NoError> {
    return car.producer.map { car in
      let HP = Int(round(Double(car.kilowatts) * CarViewModel.HPperKW))
      return "\(HP) HP"
    }
  }

  var titleTextSignal: SignalProducer<String, NoError> {
    return car.producer.map {  "\($0.make) \($0.model)" }
  }

  var photoURLSignal: SignalProducer<URL?, NoError> {
    return car.producer.map { URL(string: $0.photoURL) }
  }
}
class CarViewController: UIViewController {
  @IBOutlet modelLabel: UILabel!
  @IBOutlet makeLabel: UILabel!
  @IBOutlet horsepowerLabel: UILabel!
  @IBOutlet titleLabel: UILabel!
  @IBOutlet image: UIImageView!

  var viewModel: CarViewModel!

  override func viewDidLoad() {
    self.modelLabel.reactive.text <~ self.viewModel.modelTextSignal
    self.makeLabel.reactive.text <~ self.viewModel.makeTextSignal
    self.horsepowerLabel.reactive.text <~ self.viewModel.horsepowerTextSignal
    self.titleLabel.reactive.text <~ self.viewModel.titleTextSignal
    self.viewModel.photoURLSignal.startWithValues { [weak self] url in
      self?.setImageFromUrl(url)
    }
  }

  func displayNewCar() {
    self.viewModel.car.value = aRandomCar()
  }

  private func setImageFromUrl(url: URL?) {
    //download url and display in UIImageView
  }
  private func aRandomCar() -> Car {
    //return a Car object
  }
}