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
23
8.4k
Solving Problems the Swift Way
A presentation on solving problems in idiomatic Swift.
Ash Furrow
July 05, 2014
Tweet
Share
More Decks by Ash Furrow
See All by Ash Furrow
Migrating to React Native: A Long-Term Retrospective
ashfurrow
0
190
How Artsy Automates Team Culture
ashfurrow
0
2.9k
Building Custom TSLint Rules
ashfurrow
0
370
Circumventing Fear of the Unknown
ashfurrow
1
480
Building Better Software by Building Better Teams
ashfurrow
1
520
Building Open Source Communities
ashfurrow
0
780
Comparative Asynchronous Programming
ashfurrow
2
9.2k
Building Compassionate Software
ashfurrow
0
370
Swift, Briskly
ashfurrow
0
110
Other Decks in Technology
See All in Technology
3年でバックエンドエンジニアが5倍に増えても破綻しなかったアーキテクチャ そして、これから / Software architecture that scales even with a 5x increase in backend engineers in 3 years
euglena1215
11
4.3k
AWS re:Invent 2024 ふりかえり勉強会
yhana
0
690
ZOZOTOWN の推薦における KPI モニタリング/KPI monitoring for ZOZOTOWN recommendations
rayuron
1
870
深層学習と3Dキャプチャ・3Dモデル生成(土木学会応用力学委員会 応用数理・AIセミナー)
pfn
PRO
0
400
20240522 - 躍遷創作理念 @ PicCollage Workshop
dpys
0
310
型情報を用いたLintでコード品質を向上させる
sansantech
PRO
2
220
mixi2 の技術スタックを探ってみる (アプリ編)
ichiki1023
0
110
Formal Development of Operating Systems in Rust
riru
1
370
#TRG24 / David Cuartielles / Post Open Source
tarugoconf
0
410
Amazon Q Developerで.NET Frameworkプロジェクトをモダナイズしてみた
kenichirokimura
1
130
DevFest 2024 Incheon / Songdo - Compose UI 조합 심화
wisemuji
0
250
効率的な技術組織が作れる!書籍『チームトポロジー』要点まとめ
iwamot
2
190
Featured
See All Featured
Into the Great Unknown - MozCon
thekraken
34
1.6k
Optimizing for Happiness
mojombo
376
70k
Faster Mobile Websites
deanohume
305
30k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.9k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
Building Flexible Design Systems
yeseniaperezcruz
328
38k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
33
2.7k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.2k
Java REST API Framework Comparison - PWX 2021
mraible
28
8.3k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
44
9.3k
A Tale of Four Properties
chriscoyier
157
23k
Rails Girls Zürich Keynote
gr2m
94
13k
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