Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
λ is coming to Obj-C – ReactiveCocoa
Search
Vladimir Burdukov
February 24, 2014
Programming
1
120
λ is coming to Obj-C – ReactiveCocoa
Vladimir Burdukov
February 24, 2014
Tweet
Share
More Decks by Vladimir Burdukov
See All by Vladimir Burdukov
Alice in robovacuum land
chipp
0
58
It’s time to migrate from RxSwift to Combine. Long story short
chipp
0
80
Decodable vs real-world JSON
chipp
0
62
`fastlane beta` 2 или почему я стал пить больше кофе
chipp
0
580
`fastlane beta` или почему я стал пить больше кофе
chipp
0
130
Архитектурные излишества в iOS приложениях Superjob
chipp
0
180
λ is coming to Obj-C – ReactiveCocoa
chipp
0
380
Build bots
chipp
0
120
Other Decks in Programming
See All in Programming
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
36
23k
The Evolution of Enterprise Java with Jakarta EE 11 and Beyond
ivargrimstad
1
770
Julia という言語について (FP in Julia « SIDE: F ») for 関数型まつり2025
antimon2
3
960
業務自動化をJavaとSeleniumとAWS Lambdaで実現した方法
greenflagproject
1
120
KotlinConf 2025 現地参加の土産話
n_takehata
0
100
XSLTで作るBrainfuck処理系
makki_d
0
200
Rails産でないDBを Railsに引っ越すHACK - Omotesando.rb #110
lnit
1
160
社内での開発コミュニティ活動とモジュラーモノリス標準化事例のご紹介/xPalette and Introduction of Modular monolith standardization
m4maruyama
1
120
Development of an App for Intuitive AI Learning - Blockly Summit 2025
teba_eleven
0
120
AIエージェントによるテストフレームワーク Arbigent
takahirom
0
380
Effect の双対、Coeffect
yukikurage
5
1.4k
事業戦略を理解してソフトウェアを設計する
masuda220
PRO
22
6.1k
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Into the Great Unknown - MozCon
thekraken
39
1.8k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Facilitating Awesome Meetings
lara
54
6.4k
Agile that works and the tools we love
rasmusluckow
329
21k
Side Projects
sachag
455
42k
GraphQLとの向き合い方2022年版
quramy
46
14k
Done Done
chrislema
184
16k
How to train your dragon (web standard)
notwaldorf
92
6.1k
Adopting Sorbet at Scale
ufuk
77
9.4k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
43
2.4k
Six Lessons from altMBA
skipperchong
28
3.8k
Transcript
λ is coming to Obj-C: ReactiveCocoa Vladimir @chippcheg Burdukov
Imperative
Declarative
Functional programming λ-calculus
Functional programming
Pure function • result doesn’t depend on any state •
function doesn’t change any external state.
Pure function def sqr(x: Int): Int = x * x
//> sqr: (x: Int)Int sqr(2) /> res4: Int = 4 def add1(x: Int): Int = x + 1 //> add1: (x: Int)Int add1(4) //> res3: Int = 5 add1(add1(4)) //> res4: Int = 6
Higher-order functions
Higher-order functions def sqr(x: Int): Int = x * x
def sumF(x: Int, y: Int, f: Int => Int) = f(x) + f(y) sumF(3, 4, sqr) //> res5: Int = 25
Higher-order functions def sqr(x: Int): Int = x * x
def sumF(x: Int, y: Int, f: Int => Int) = f(x) + f(y) sumF(3, 4, sqr) //> res5: Int = 25 sumF(-9, 16, abs) //> res6: Int = 25
Tail recursion
Tail recursion Lists Head Tail
Tail recursion Lists val foo: List[Int] = 1 to 5
toList //> foo : List[Int] = List(1, 2, 3, 4, 5) val foohead = foo.head //> foohead : Int = 1 val footail = foo.tail //> footail : List[Int] = List(2, 3, 4, 5)
Tail recursion def sumList(xs: List[Int]): Int = if (xs ==
Nil) return 0 else return xs.head + sumList(xs.tail) // > sumList: (xs: List[Int])Int ! sumList(foo) //> res3: Int = 15
Composition
Composition def f(a: String): String = "f(" + a +
")" f("5") //> res11: String = f(5) def g(a: String): String = "g(" + a + “)" g("5") //> res12: String = g(5) f(g("5")) //> res13: String = f(g(5)) def fg = f _ compose g _ //> fg: => String => String fg("5") //> res14: String = f(g(5))
Functional programming References •https://www.coursera.org/course/progfun
Reactive Programming
Reactive Programming 5 10 =SUM(A1;B1) A1 B1 C1
Functional Reactive Programming
ReactiveCocoa Next step of Objective-C evolution https://github.com/ReactiveCocoa/ReactiveCocoa/
Introduction https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/Documentation/
Introduction https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/Documentation/ pod
RACSequense RACSignal
RACSignal
RACSignal UISwitch *settingSwitch = [[UISwitch alloc] init]; RACSignal *switchSignal =
[settingSwitch rac_signalForControlEvents:UIControlEventValueChanged]; [switchSignal subscribeNext:^(UISwitch *x) { NSLog(@"SWITCH %@", x.on); }]; //SWITCH 0 //SWITCH 1 //SWITCH 0
RACSignal signal subscribeNext:
RACSignal Composition [[[self.field rac_textSignal] filter:^BOOL(NSString *value) { return value.length >=
8; }] subscribeNext:^(id x) { NSLog(@"%@", x); }];
RACSignal Combining signal signal combine reduce YES/NO NSString NSString
RACSignal Combining RAC(self.createButton, enabled) = [RACSignal combineLatest:@[self.loginField.rac_textSignal, self.passwordField.rac_textSignal] reduce:^id(NSString *username,
NSString *password) { return @(username.length > 0 && password.length > 0); }];
RACSequence
Binding RAC(self.avatarImageView, image) = RACObserve(self.viewModel, userAvatar);
ReactiveCocoa UI extensions • UIActionSheet / UIAlertView • UIButton •
UITableViewCell • UIControl (rac_signalForControlEvents:) • UIGestureRecognizer • UITextField
UIAlertView Signal UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Something goes
wrong" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:@"Retry", nil]; ! [[alertView rac_buttonClickedSignal] subscribeNext:^(NSNumber *buttonNumber) { NSLog(@"alert button: %@", [alertView buttonTitleAtIndex:buttonNumber.intValue]); }];
UIButton Command RACCommand *loginCommand = [[RACCommand alloc] initWithEnabled:[RACSignal combineLatest:@[loginField.rac_textSignal, passwordField.rac_textSignal]
reduce:^id(NSString *username, NSString *password) { return @(username.length > 0 && password.length > 0); }] signalBlock:^RACSignal *(id input) { return [[JMHSync shared] loginUser:self.loginField.text withPassword:self.passwordField.text]; }]; ! self.createButton.rac_command = loginCommand;
UITextField Signal [self.loginField.rac_textSignal subscribeNext:^(NSString *x) { NSLog(@"you entered %@", x);
}];
Conclusion
Questions
Thank you!