简单的代码快速转换为reactswift

弗拉迪斯拉夫

人们如何转换我的代码:

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
    }
} 

和:

class CarViewModel {
    private var car: Car?

    static let HPperKW = 1.34102209

    var modelText: String? {
        return car?.model
    }
    var makeText: String? {
        return car?.make
    }
    var horsepowerText: String? {
        guard let kilowatts = car?.kilowatts else { return nil }
        let HP = Int(round(Double(kilowatts) * CarViewModel.HPperKW))
        return "\(HP) HP"
    }
    var titleText: String? {
        guard let make = car?.make, let model = car?.model else { return nil }
        return "\(make) \(model)"
    }
    var photoURL: URL? {
        guard let photoURL = car?.photoURL else { return nil }
        return URL(string: photoURL)
    }

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

到ReactiveCocoa / ReactiveSwift。我读过。关于Reactive的文档,但是我不了解如何对代码实现Reactive API。谁知道我需要怎么做,请告诉我。还有谁知道最新版本ReactiveCocoa / ReactiveSwift的良好示例/示例/教程,请告诉我。

埃文·德鲁里(Evan Drewry)

ReactiveCocoa用于将动态数据(保存在您的视图模型中)绑定到ViewController的UI。如果您的数据不是动态的(如果视图模型在视图控制器的整个生命周期中都没有变化),则根本不需要使用反应性可可。但是,如果您的car变量将更改,并且单个视图控制器将用于显示多辆汽车,则反应性可可将非常有用。您可以使用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) }
  }
}

现在,我们有一堆表示car随时间变化的数据的信号,可以使用ReactiveCocoa将这些信号绑定到UI,以便每次更新时,UI都会自动使用新的汽车数据viewModel.car.value进行更新!

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
  }
}

因此,您可以看到如果只需要在视图控制器中显示一个不变的汽车对象,则不需要ReactiveCocoa,但是,如果您的视图模型在视图控制器的整个生命周期中都在变化,则reactcocoa将允许您绑定可变数据到用户界面,以便只要数据更改,您的视图就会自动更新!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将简单的 IDL 参数代码转换为 python 代码

快速将代码转换为组件以供多次使用

快速代码使用avspeechsynthizer将语音转换为文本

如何将这个简单的python代码转换为javascript?

将简单的C#语句转换为伪代码

如何将简单的 Excel LOOKUP 转换为 R 代码?

C代码快速转换

快速将简单的字符串转换为JSON字符串

如何快速将ISO 4217代码转换为货币代码

使用文件上传最大大小事件的代码转换为简单代码

如何将简单的 jQuery 代码转换为以下代码的 wordpress jQuery

快速从AnyHashable转换为枚举

快速通过Unicode将国家代码转换为表情符号标志

我可以快速将字符串转换为代码块吗?

如何将存储在变量中的字符串快速转换为可执行代码文本?

简单的交换代码无法快速运行

由于一些无效的IL代码,无法将简单类转换为IL?

将字符串转换为双精度的简单代码不起作用

有没有一种简单的方法可以将jquery代码转换为javascript?

如何在Laravel中将HTML FORM转换为简单的html代码?

将python代码转换为java以计算简单连接图的数量的未知问题

您是否有功能或工具将简单的html转换为我喜欢的特殊代码?

创建简单的代码以将我的数据集从R转换为宽到长

快速将图像RGB转换为BGR

快速将NSTimeInteval转换为NSDate

将PDF转换为图像的快速方法

快速将String转换为AnyObject

快速帮助:将SQL转换为LINQ

快速将ByteBuffer转换为CharBuffer或char []