對FRP跟Swift還沒很熟, 直接玩ReactiveCocoa 有點苦手, 不過, 還挺好玩的
狀況設計: 畫面上有一個輸入框, 和一個文字標籤, 在輸入框輸入文字後, 標籤要同步顯示一樣的文字, 文字框輸入不滿三個字母時背景要顯示紅色,像這樣:
所以會有一個標籤(myLabel)和一個輸入框(myInput):
@IBOutlet weak var myLabel: UILabel! @IBOutlet weak var myInput: UITextField!
要做到這樣的功能, 不只有一種作法, 像是也可以用KVO去observe一個變數由那個來改變myLabel的值,但KVO的缺點是, 被observe的那個必須是dynamic的, 所以沒辦法直接observer myInput.text
但用ReactiveCocoa來做的話就簡單的有趣, 首先如果要達到第一個需求, 只需要
var text_signal = myInput.rac_textSignal() text_signal.setKeyPath("text", onObject: myLabel)
這還真是么壽簡單, 只是把myInput.text跟myLabel.text抓條線連一起就好了!
那第二項呢?
text_signal.map({ (textObj:AnyObject!)->AnyObject in var text = textObj as! String return count(text) < 3 ? UIColor.redColor():UIColor.whiteColor() }).setKeyPath("backgroundColor", onObject: myInput)
這也是簡單的不行, 把輸入的Signal用map轉換成UIColor, 而轉換的條件就是以text的長度來計算, 最後連到myInput.backgroundColor去, 挺有趣的(雖然也不是很好懂)