私が理解していることから、RACSubject
ReactiveCocoa 4 に相当するのはObserver
クラスです。信号とオブザーバーをリンクして、信号がイベントを送信し、オブザーバーに送信されたイベントにマップ操作を適用したいと考えています。Obj-C では、次のようになります。
// ViewModel.h
@interface ViewModel
@property (readonly) RACSubject *someAction; //expects e.g. int values
@property (readonly) RACSignal *someSignal; //sends e.g. string values
@end
// ViewModel.m
//redeclaring the signal and action as readwrite
@implementation
- (id)init {
_someAction = [RACSubject subject];
_someSignal = [_someAction map:^id(NSNumber *index) {
return "Some string based on index passed in";
}];
}
@end
誰かが に値をプッシュするとsomeAction
、someSignal
は派生値を含むイベントを発生させます。Swiftで同じ効果を得るにはどうすればよいですか?
私がこれまでにできたことは、次のようなものです。
public class ViewModel: NSObject {
public let (internalSignal, someAction) = Signal<Int, NoError>.pipe()
public var someSignal: Signal<String, NoError> {
get {
return self.internalSignal.map({ [unowned self](index: Int) -> String in
return "Some string value based on \(self.someArray[index])"
})
}
}
public let someArray = [1, 2, 3, 4, 5]
}
これは悪い解決策のように見えます。
internalSignal
プライベートにする必要がありますが、Signal のパイプと一致させるためにパブリックとして宣言する必要がありますsomeSignal
したがって、同じ信号を何度も再利用できる場合でも、必要になるたびに計算されます。let
また、定数として宣言することはできません。