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
59
It’s time to migrate from RxSwift to Combine. Long story short
chipp
0
84
Decodable vs real-world JSON
chipp
0
71
`fastlane beta` 2 или почему я стал пить больше кофе
chipp
0
600
`fastlane beta` или почему я стал пить больше кофе
chipp
0
140
Архитектурные излишества в iOS приложениях Superjob
chipp
0
200
λ is coming to Obj-C – ReactiveCocoa
chipp
0
390
Build bots
chipp
0
120
Other Decks in Programming
See All in Programming
Domain-centric? Why Hexagonal, Onion, and Clean Architecture Are Answers to the Wrong Question
olivergierke
3
960
タスクの特性や不確実性に応じた最適な作業スタイルの選択(ペアプロ・モブプロ・ソロプロ)と実践 / Optimal Work Style Selection: Pair, Mob, or Solo Programming.
honyanya
3
190
O Que É e Como Funciona o PHP-FPM?
marcelgsantos
0
190
なぜGoのジェネリクスはこの形なのか? - Featherweight Goが明かす設計の核心
qualiarts
0
240
フロントエンド開発のためのブラウザ組み込みAI入門
masashi
7
3.4k
Devoxx BE - Local Development in the AI Era
kdubois
0
140
Introduce Hono CLI
yusukebe
6
3.1k
AI 駆動開発におけるコミュニティと AWS CDK の価値
konokenj
5
220
Vueのバリデーション、結局どれを選べばいい? ― 自作バリデーションの限界と、脱却までの道のり ― / Which Vue Validation Library Should We Really Use? The Limits of Self-Made Validation and How I Finally Moved On
neginasu
2
1.4k
AI Agent 時代的開發者生存指南
eddie
4
2.1k
なんでRustの環境構築してないのにRust製のツールが動くの? / Why Do Rust-Based Tools Run Without a Rust Environment?
ssssota
13
42k
alien-signals と自作 OSS で実現する フレームワーク非依存な ロジック共通化の探求 / Exploring Framework-Agnostic Logic Sharing with alien-signals and Custom OSS
aoseyuu
2
500
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
49
51k
How to Ace a Technical Interview
jacobian
280
24k
How to train your dragon (web standard)
notwaldorf
97
6.3k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.1k
Designing for humans not robots
tammielis
254
26k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.5k
Why Our Code Smells
bkeepers
PRO
340
57k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
130k
Music & Morning Musume
bryan
46
6.9k
Six Lessons from altMBA
skipperchong
29
4k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.7k
Building Better People: How to give real-time feedback that sticks.
wjessup
369
20k
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!