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
210
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
61
Preparing for the future of API Description Languages
kylef
0
79
Resilient API Design
kylef
1
280
Building a Swift Web API and Application Together
kylef
2
1.8k
Testing without Xcode - CMD+U 2016
kylef
0
220
End-to-end: Building a Web Service in Swift (MCE 2016)
kylef
2
450
Designing APIs for Humans - Write the Docs 2016
kylef
0
280
Embracing Change - MBLTDev 2015
kylef
3
620
Practical Declarative Programming (360 iDev 2015)
kylef
3
440
Other Decks in Technology
See All in Technology
あなたの知らないiOS開発の世界
recruitengineers
PRO
3
180
効果的なオンコール対応と障害対応
ryuichi1208
6
3.1k
o1のAPIで実験してみたが 制限きつすぎて辛かった話
pharma_x_tech
0
210
フルカイテン株式会社 採用資料
fullkaiten
0
32k
【株式会社ELYZA】|GENIAC成果報告会 自社開発モデルプレゼンテーション
elyza
1
310
ナレッジグラフとLLMの相互利用
koujikozaki
0
420
「認証認可」という体験をデザインする ~Nekko Cloud認証認可基盤計画
logica0419
2
450
Fediverse Discovery Providers overview
andypiper
0
170
Tricentisにおけるテスト自動化へのAI活用ご紹介/20240910Shunsuke Katakura
shift_evolve
0
200
PdMはどのように全てのスピードを上げられるか ~ 非連続進化のための具体的な取り組み ~
sansantech
PRO
4
1.3k
可視化により内部品質をあげるAIドキュメントリバース/20240910 Hiromitsu Akiba
shift_evolve
0
220
『GRANBLUE FANTASY: Relink』最高の「没入感」を実現するカットシーン制作手法とそれを支える技術
cygames
1
140
Featured
See All Featured
How To Stay Up To Date on Web Technology
chriscoyier
786
250k
Faster Mobile Websites
deanohume
304
30k
Facilitating Awesome Meetings
lara
49
6k
How GitHub Uses GitHub to Build GitHub
holman
472
290k
Web Components: a chance to create the future
zenorocha
309
42k
Embracing the Ebb and Flow
colly
83
4.4k
The Mythical Team-Month
searls
218
43k
Happy Clients
brianwarren
96
6.6k
Building Better People: How to give real-time feedback that sticks.
wjessup
359
19k
Pencils Down: Stop Designing & Start Developing
hursman
119
11k
Thoughts on Productivity
jonyablonski
66
4.2k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
326
21k
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