Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Solving Problems the Swift Way
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Ash Furrow
July 05, 2014
Technology
8.9k
23
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Solving Problems the Swift Way
A presentation on solving problems in idiomatic Swift.
Ash Furrow
July 05, 2014
Transcript
47 slides
Idiomatic Swift Ash Furrow @ashfurrow
None
1.Better ways to solve familiar problems using Swift 2.Everyone is
a beginner again 3.We should share what we learn
Problem-Solving
You are here You wanna be here “Problem Solving”
• It would be a shame not to take advantage
of these new tools and techniques • Let’s take a look at some examples
• Completely new concept of nil • Indicates “missing” value
• Replaces nil, Nil, NULL, CGRectNull, -1, NSNotFound, NSNull, etc • Haskell’s “Maybe” type • C#’s “Nullable Types” Optionals
• Works well with Swift’s compile-time type safety • Which
is awesome • No, seriously, awesome • Eliminates several classes of bugs • Don’t over-use optional types Optionals
let a = someFunction() //returns Int? if a != nil
{ // use a! } Optionals
let a = someFunction() //returns Int? if let b =
a { // do something with b } if let a = a { // do something with a } Optionals
• Tuples are compound values • They are lightweight, temporary
containers for multiple values • Those values can be named • Useful for functions with multiple return types Tuples
func calculate() -> (Bool, Int?) { // ... return (result,
errorCode) } Tuples
func calculate() -> (Bool, Int?) { // ... return (result,
errorCode) } ! let calculation = calculate() ! if (calculation.0) { // … } Tuples
func calculate() -> (Bool, Int?) { // ... return (result,
errorCode) } ! let calculation = calculate() let (result, _) = calculation ! if (result) { // … } Tuples
func calculate() -> (result: Bool, errorCode: Int?) { // ...
return (result: result, errorCode: errorCode) } ! let calculation = calculate() if (calculation.errorCode) { // ... } Tuples
for (key, value) in dictionary { // ... } Tuples
• New APIs shouldn’t use out parameters • eg: NSError
pointers • Really great for use in pattern-matching Tuples
• Borrowed from functional programming • Really useful in tail-recursive
functions • Like “switch” statements on steroids Pattern-Matching
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath { switch (indexPath.section) { case
0: { switch (indexPath.row) { case 0: ... } } break; } } Pattern-Matching
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath { switch (indexPath.section) { case
ASHLoginSection: { switch (indexPath.row) { case ASHLoginSectionUserNameRow: ... } } break; } } Pattern-Matching
override func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) { switch (indexPath.section,
indexPath.row) { case (0, _): ... default: ... } } Pattern-Matching
override func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) { switch (indexPath.section,
indexPath.row) { case (0, let row): ... default: ... } } Pattern-Matching
override func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) { switch (indexPath.section,
indexPath.row) { case (0, let row) where row > 5: ... default: ... } } Pattern-Matching
struct IntList { var head: Int = 0 var tail:
IntList? } ! ... ! switch (list.head, list.tail) { case (let head, nil): //... case (let head, let tail): //... } Pattern-Matching
• Generics are common in other languages, like C# and
C++ • Using a generic type as a placeholder, we can infer the type of variables at compile- time • A part of Swift’s “safe by default” behaviour Generics
struct Stack<T> { var items = [T]() mutating func push(item:
T) { items.append(item) } mutating func pop() -> T { return items.removeLast() } } Generics
var stack = Stack<Int>() ! var stack = Stack<String>() !
var stack = Stack<Recipe>() Generics
struct Stack<T: Equatable> : Equatable { var items = [T]()
mutating func push(item: T) { items.append(item) } mutating func pop() -> T { return items.removeLast() } } ! func ==<T>(lhs: Stack<T>, rhs: Stack<T>) -> Bool { return lhs.items == rhs.items } Generics
• Use stacks whenever you want to define an abstract
data type structure • Whenever possible, don’t bind new data structures to existing ones • Use protocols for loose coupling Generics
• Optionals • Pattern-matching • Tuples • Generics
Everyone is a Beginner
• No one is an expert in Swift • This
can be kind of stressful • Relax Everyone is a Beginner
• The benefits outweighs the cost of learning • Depending
on your circumstance • Have your say Everyone is a Beginner
• The hardest thing is the most important thing •
Start Everyone is a Beginner
• Don’t be embarrassed to ask questions! • Try to
ask in public so others can benefit from the answer Everyone is a Beginner
• Let’s borrow ideas Everyone is a Beginner
• Community-based conventions and guidelines are still being established Everyone
is a Beginner
We Should Share What We Learn
• Conventions and guidelines are still in flux • There’s
an opportunity to significantly alter the future of iOS and OS X programming We Should Share What We Learn
• The demand for material on Swift is HUGE •
Great opportunity to get known We Should Share What We Learn
• When you teach, you learn We Should Share What
We Learn
• If we all share what we learn, we all
get smarter • Rising tides lift all boats We Should Share What We Learn
• Stack Overflow • Blogs • Tweets • Gists •
Open source • Radars We Should Share What We Learn
http://github.com/artsy/eidolon
1.Better ways to solve familiar problems using Swift 2.Everyone is
a beginner again 3.We should share what we learn
Let’s Make Better Mistakes Tomorrow
Thank you" @ashfurrow
More Decks by Ash Furrow
See All by Ash Furrow
My Slow Return to a Swift Career
ashfurrow
0
40
Migrating to React Native: A Long-Term Retrospective
ashfurrow
0
370
How Artsy Automates Team Culture
ashfurrow
0
3.5k
Building Custom TSLint Rules
ashfurrow
0
550
Circumventing Fear of the Unknown
ashfurrow
1
630
Building Better Software by Building Better Teams
ashfurrow
1
740
Building Open Source Communities
ashfurrow
0
1.1k
Comparative Asynchronous Programming
ashfurrow
2
9.9k
Building Compassionate Software
ashfurrow
0
630
Other Decks in Technology
See All in Technology
Biohub - Cell Tracking During Development 5th place solution
rist
0
140
田んぼの見回りをIoTで減らしたい!水位監視から電池駆動カメラまでの試行錯誤
itosoft
1
120
田んぼから始まる挑戦 〜新米農家の1年目〜
miu_crescent
PRO
0
140
Bots in Kiro Crew (One point of contact for ongoing work) | Kiro: Zero to Hero 12
inariku
PRO
1
130
Kiro 入門 (1 つのエージェントを、どの画面からでも) | 目指せ Kiro マスター 01
inariku
PRO
6
1.7k
Claude Codeで新規事業を伸ばせるか? Zennの試行錯誤の記録
wadayusuke
2
150
AI時代に求められる優秀なTechLeadの振る舞い
pospome
11
16k
Claude Codeで作ったアプリを安全に公開する/Built with Claude Japan 2026
yoshidashingo
0
230
JAWS_FESTA2026_オンプレ-AWS間プロキシサーバの移行_性能_障害対応で得た実践ノウハウ_高島一晃.pdf
tkazuaki0820
1
110
AWS Quick 入門 | 目指せ Quick マスター 01
inariku
PRO
2
330
Kiro CLI 入門 (ターミナルと CI で使う) | 目指せ Kiro マスター 03
inariku
PRO
2
140
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
17
120k
Featured
See All Featured
Measuring & Analyzing Core Web Vitals
bluesmoon
9
1.1k
A Soul's Torment
seathinner
9
3.9k
Design in an AI World
tapps
1
390
Fantastic passwords and where to find them - at NoRuKo
philnash
53
4k
The Limits of Empathy - UXLibs8
cassininazir
2
780
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
480
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.4k
From π to Pie charts
rasagy
1
440
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
620
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
470
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
310