简单代码 swift 到响应式 swift
Simple code swift to reactiveswift
人们如何转换我的代码:
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。
谁知道我需要怎么做,请告诉我。
还有谁知道最后一个版本samples/examples/tutorials好ReactiveCocoa/ReactiveSwift,请告诉我。
ReactiveCocoa 用于将 动态 数据(保存在您的视图模型中)绑定到 ViewController 的 UI。如果你的数据不是动态的(如果 viewmodel 在 viewcontroller 的生命周期中没有改变)你根本不需要使用 reactivecocoa。但是,如果您的 car
变量将发生变化并且单个 viewcontroller 将用于显示多辆汽车,则 reactivecocoa 将非常有用。您可以使用 MutableProperty
class 封装动态 car
变量并创建信号,只要汽车 属性 发生变化,就会更新 ViewController。
class CarViewModel {
let car: MutableProperty<Car>
init(_ car: Car) {
self.car = MutableProperty(car)
}
var modelTextSignal: SignalProducer<String, NoError> {
return car.producer.map { [=10=].model }
}
var makeTextSignal: SignalProducer<String, NoError> {
return car.producer.map { [=10=].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 { "\([=10=].make) \([=10=].model)" }
}
var photoURLSignal: SignalProducer<URL?, NoError> {
return car.producer.map { URL(string: [=10=].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 是不需要的——但是,如果你的视图模型在 viewcontroller 的整个过程中发生变化在整个生命周期中,reactivecocoa 将允许您将可变数据绑定到 UI,以便您的视图在数据更改时自动更新!
人们如何转换我的代码:
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。 谁知道我需要怎么做,请告诉我。 还有谁知道最后一个版本samples/examples/tutorials好ReactiveCocoa/ReactiveSwift,请告诉我。
ReactiveCocoa 用于将 动态 数据(保存在您的视图模型中)绑定到 ViewController 的 UI。如果你的数据不是动态的(如果 viewmodel 在 viewcontroller 的生命周期中没有改变)你根本不需要使用 reactivecocoa。但是,如果您的 car
变量将发生变化并且单个 viewcontroller 将用于显示多辆汽车,则 reactivecocoa 将非常有用。您可以使用 MutableProperty
class 封装动态 car
变量并创建信号,只要汽车 属性 发生变化,就会更新 ViewController。
class CarViewModel {
let car: MutableProperty<Car>
init(_ car: Car) {
self.car = MutableProperty(car)
}
var modelTextSignal: SignalProducer<String, NoError> {
return car.producer.map { [=10=].model }
}
var makeTextSignal: SignalProducer<String, NoError> {
return car.producer.map { [=10=].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 { "\([=10=].make) \([=10=].model)" }
}
var photoURLSignal: SignalProducer<URL?, NoError> {
return car.producer.map { URL(string: [=10=].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 是不需要的——但是,如果你的视图模型在 viewcontroller 的整个过程中发生变化在整个生命周期中,reactivecocoa 将允许您将可变数据绑定到 UI,以便您的视图在数据更改时自动更新!