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
Solving Problems the Swift Way
Search
Ash Furrow
July 05, 2014
Technology
8.8k
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
More Decks by Ash Furrow
See All by Ash Furrow
Migrating to React Native: A Long-Term Retrospective
ashfurrow
0
310
How Artsy Automates Team Culture
ashfurrow
0
3.4k
Building Custom TSLint Rules
ashfurrow
0
490
Circumventing Fear of the Unknown
ashfurrow
1
590
Building Better Software by Building Better Teams
ashfurrow
1
670
Building Open Source Communities
ashfurrow
0
980
Comparative Asynchronous Programming
ashfurrow
2
9.7k
Building Compassionate Software
ashfurrow
0
550
Swift, Briskly
ashfurrow
0
200
Other Decks in Technology
See All in Technology
FPGAの開発コンペでZephyrを使ってみた
iotengineer22
0
120
【Snowflake Summit 2026 Recap!!】Snowflake Summit Deep Dive: Security & Governance
civitaspo
1
260
【NRUG vol.18】なぜ多くのオブザーバビリティ導入は失敗するのか
nrug_member
0
190
アンオフィシャルな、オフィシャルからのお願い
wyamazak_devrel
0
140
SONiCで構築・運用する生成AI向けパブリッククラウドネットワーク ~実装編~
sonic
0
280
スタートアップにAmazon EKSは早すぎる? マルチプロダクト戦略を加速する Platform Engineeringの実践 / Is Amazon EKS Too Soon for Startups? Practical Platform Engineering to Accelerate a Multi-Product Strategy
elmodev09
0
300
【NRUG vol.18】KubernetesにおけるNew Relicデータ取得量削減の考え方
nrug_member
0
160
Kiro Ambassador を目指す話
k_adachi_01
0
110
SONiCのLinuxベースを活かしたZabbix監視
sonic
0
230
現地で盛り上がった WWDC26 Keynote
zozotech
PRO
1
260
AIのReact習熟度を測る
uhyo
2
650
気軽に使える"情報のハブ"としてのNotion活用 〜フロー情報の集積点 と、 Claude Code × Notion AI〜
syucream
1
150
Featured
See All Featured
Claude Code のすすめ
schroneko
67
230k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
1
200
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
780
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
620
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
62
44k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
340
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.1k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
970
How to Ace a Technical Interview
jacobian
281
24k
Transcript
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