19. Subscriber.swi+
public final class Subscriber<T>: SinkType {
public typealias Element = Event<T>
public let disposable = CompositeDisposable()
public init<S: SinkType where S.Element == Event<T>>(_ sink: S)
public convenience init(handler: Event<T> -> ())
public convenience init(
next: T -> (),
error: NSError -> (),
completed: () -> ())
public func put(event: Event<T>)
}
20. Subscriberの使用例
extension ColdSignal {
public func asDeferredRACSignal<U: AnyObject>
(evidence: ColdSignal -> ColdSignal<U?>) -> RACSignal {
return RACSignal.createSignal { subscriber in
let selfDisposable = evidence(self).subscribe(next: { value in
subscriber.sendNext(value)
}, error: { error in
subscriber.sendError(error)
}, completed: {
subscriber.sendCompleted()
})
return RACDisposable {
selfDisposable.dispose()
}
}
}
}
22. Iden%ty.swi,
/// The identity function, which returns its argument.
///
/// This can be used to prove to the typechecker that a given type A is
/// equivalent to a given type B.
///
/// For example, the following global function is normally impossible to bring
/// into the `Signal<T>` class:
///
/// func merge<U>(signal: Signal<Signal<U>>) -> Signal<U>
///
/// However, you can work around this restriction using an instance method with
/// an “evidence” parameter:
///
/// func merge<U>(evidence: Signal<T> -> Signal<Signal<U>>) -> Signal<U>
///
/// Which would then be invoked with the identity function, like this:
///
/// signal.merge(identity)
///
/// This will verify that `signal`, which is nominally `Signal<T>`, is logically
/// equivalent to `Signal<Signal<U>>`. If that's not actually the case, a type
/// error will result.
public func identity<T>(id: T) -> T {
return id
}
25. HotSignal.swi-public
final class HotSignal<T> {
public init(_ generator: SinkOf<T> -> ())
public class func never() -> HotSignal
public func observe<S: SinkType where S.Element == T>
(observer: S) -> Disposable
public func observe(next: T -> ()) -> Disposable
}
27. HotSignal/Observer(SinkOf<T>)の使用例
extension HotSignal {
/// Creates a RACSignal that will forward values from the receiver.
///
/// evidence - Used to prove to the typechecker that the receiver is
/// a signal of objects. Simply pass in the `identity` function.
///
/// Returns an infinite signal that will forward all values from the
/// underlying HotSignal. The returned RACSignal will never complete or
/// error, so it must be disposed manually.
public func asInfiniteRACSignal<U: AnyObject>
(evidence: HotSignal -> HotSignal<U?>) -> RACSignal {
return RACSignal.createSignal { subscriber in
evidence(self).observe { subscriber.sendNext($0) }
return nil
}
}
}
29. ObservableProperty.swi1
public final class ObservableProperty<T> {
public func values() -> ColdSignal<T>
// setするとvalues()の戻り値のColdSignalのsubscriberに通知される
public var value: T
// not public: ミス or 他からの変換?
init(_ value: T)
/**
public func __conversion() -> T
public func __conversion() -> Signal<T>
*/
}
extension ObservableProperty: SinkType {
public func put(value: T)
}
30. ObservablePropertyの使用例
public class Hoge {
let name: ObservableProperty<String> = ObservableProperty("nanashi")
}
public func printName(name: String) {
println(name)
}
let hoge = Hoge()
printName(hoge.name.value)
// => nanashi
hoge.name.values().subscribe(next: { name in
println("(name): name was changed!")
})
// => nanashi: name was changed! : 最初に現在値が通知される
hoge.name.value = "ikesyo"
// or
hoge.name.put("ikesyo") // by SinkType
// => ikesyo: name was changed!
33. Ac#on.swi*
public final class Action<Input, Output> {
// RACCommand.executionSignals相当は現時点でなし
public let executing: ColdSignal<Bool> // 実行中かどうか
public let enabled: ColdSignal<Bool> // 有効かどうか
public let values: HotSignal<Output> // 成功結果
public let errors: HotSignal<NSError> // 失敗結果
// アクションとなるクロージャを渡す
public init(enabledIf: HotSignal<Bool>,
execute: Input -> ColdSignal<Output>)
public func execute(input: Input) -> ColdSignal<Output> // アクションの実行
}