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
A Swift Approach (Warsaw 2014)
Search
Kyle Fuller
November 27, 2014
Technology
4
230
A Swift Approach (Warsaw 2014)
Kyle Fuller
November 27, 2014
Tweet
Share
More Decks by Kyle Fuller
See All by Kyle Fuller
Design APIs and deliver what you promised
kylef
0
85
Preparing for the future of API Description Languages
kylef
0
100
Resilient API Design
kylef
1
320
Building a Swift Web API and Application Together
kylef
2
2k
Testing without Xcode - CMD+U 2016
kylef
0
240
End-to-end: Building a Web Service in Swift (MCE 2016)
kylef
2
480
Designing APIs for Humans - Write the Docs 2016
kylef
0
310
Embracing Change - MBLTDev 2015
kylef
3
670
Practical Declarative Programming (360 iDev 2015)
kylef
3
500
Other Decks in Technology
See All in Technology
AI駆動時代の新規事業の作り方
ryohysk
2
140
主要ライブラリの実例に学ぶ、TypeScriptで実現する型安全な座標定義
tiroljpn
1
220
情熱と工夫で走り抜け! コミュニティをささえるObservability実践録
b1gb4by
1
120
GigaViewerにおけるMackerel APM導入の裏側
7474
0
110
GitHub Coding Agent 概要
kkamegawa
1
430
AIに実況させる / AI Streamer
motemen
0
930
KMP導⼊において、マネジャーとして考えた事
sansantech
PRO
1
160
SRE/インフラエンジニアの市場価値とキャリアパス/Market value and career path for SRE-infrastructure engineers
takumakume
1
320
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
720
大事なのは、AIの精度だけじゃない!〜1円のズレも許されない経理領域とAI〜
jun_nemoto
7
4.3k
さくらのクラウド 開発の挑戦とその舞台裏
kazeburo
0
690
Zero Data Loss Autonomous Recovery Service サービス概要
oracle4engineer
PRO
1
7.1k
Featured
See All Featured
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
KATA
mclloyd
29
14k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.2k
Product Roadmaps are Hard
iamctodd
PRO
53
11k
Unsuck your backbone
ammeep
671
58k
Documentation Writing (for coders)
carmenintech
71
4.8k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
730
Optimising Largest Contentful Paint
csswizardry
37
3.2k
Designing for humans not robots
tammielis
253
25k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
820
Fireside Chat
paigeccino
37
3.5k
Transcript
A SWIFT APPROACH KYLEFULLER
KYLEFULLER
None
None
NEW CONCEPTS
RUNTIME
@objc / NSObject
NSKeyValueObserving
RUNTIME
WWDC 2015
OPTIONALS?
func compute() -> Bool?
true false neither
LACK OF A VALUE
NOT AN EMPTY VALUE
CAN'T WE DO THIS IN OBJECTIVE-C?
nil Nil NULL CGRectNull -1 0 NSNotFound NSNull ...
EXPRESS YOU DON'T ACCEPT NIL
EXPRESS YOU WILL NOT RETURN NIL
/// You **MUST** pass in a URL - (instancetype)initWithURL:(NSURL *)URL
{ NSParameterAssert(URL != nil); }
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)path { return nil; }
None
RUNTIME ERROR
RUNTIME ERROR
COMPILE ERROR
None
TUPLES
func get(username:String) -> (Person?, NSError?)
let person, error = get("Kyle")
OBJECTIVE-C
NSError *error; Person *person = [Person getPerson:@"Kyle" error:&error];
NAMED TUPLES
func get(username:String) -> (person:Person?, error:NSError?)
let result = get("Kyle") result.person result.error
- (NSArray *)getPerson:(NSString *)username; - (NSDictionary *)getPerson:(NSString *)username;
NSDictionary *components = [Person getPerson:@"kyle"]; Person *person = components["person"]; NSError
*error = components["error"];
TYPE SAFETY?
FRAGILE
ENUMERATIONS
enum Result { case Success(String) case Error(Error) }
switch result { case .Error(let error): println("There was an error
(\(error)).") case .Success(let string): println("\(string)") }
CLOSURES
EVERYTHING IS A CLOSURE
class TestObject { func testA() -> () { println("first test")
} var testB:(() -> ()) = { println("second test") } }
let testing = TestObject() testing.testA() testing.testB()
testing.testB = testing.testA
testing.testB() // Actually calls testA
CONSISTENCY
FUNCTIONAL
None
let string = "Hello World" let matches:[NSTextCheckingResult] = /* regex
for words in string */ matches.map { string.substringWithRange($0.range) }
let string = "Hello World" let matches:[NSTextCheckingResult] = /* regex
for words in string */ var strings = [String]() for match in matches { let catch = string.substringWithRange(match.range) strings.append(catch) }
func reduce(initial, combine) -> result
combine : ((previous, current) -> (result))
let items = [["a", "b"], ["c", "d"], ["e"]] items.reduce([]) {
initial, expressions -> [String] in initial + expressions } => ["a", "b", "c", "d", "e"]
let items = [["a", "b"], ["c", "d"], ["e"]] items.reduce([], +)
=> ["a", "b", "c", "d", "e"]
func +<T>(lhs:[T], rhs:[T]) -> [T]
items.sort { $0 > $1 }
items.sort(>)
items.filter { $0.hasPermission }
func isAdmin(user:User) -> Bool { return user.username == "Kyle" }
users.filter(isAdmin)
GENERICS
Array<String>
Dictionary<String, Int>
func max<T : Comparable>(a:T, b:T) -> T { return a
> b ? a : b }
max(anInteger, anotherInteger) max(aFloat, anotherFloat) max(aString, anotherString)
PATTERN MATCHING
let point = (1, 2) switch point { case (0,
0): println("(0, 0) is at the origin.") case (-2...2, -2...2): println("(\(point.0), \(point.1)) is near the origin.") default: println("The point is at (\(point.0), \(point.1)).") } // prints "(1, 2) is near the origin."
@auto_closure
delay(5, println("Hello World"))
func delay(time:UInt32, block:@auto_closure) { sleep(time) block() }
BUILDING ASSERT() IN SWIFT
assert(someExpensiveComputation() != 42)
func assert(predicate : () -> Bool) { #if !NDEBUG if
!predicate() { abort() } #endif }
PLAYGROUNDS
PLAYGROUNDS
SWIFT
SAFER
CONVENTIONS
CONVENTIONS
LANGUAGE CONSTRAINTS
BETTER CODE
BETTER DEVELOPERS
LESS BUGS
WE'RE ALL BEGINNERS
PERFECTING
BREAKING CHANGES
- Xcode 6.1 + Xcode 6.1.1
FOR GOOD, NOT EVIL
!
FILE RADARS
FUTURE
COMMON DESIGN PATTERNS
KYLEFULLER