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
Design patterns in Swift Vol. 0
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Johnlin
December 13, 2016
Programming
120
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Design patterns in Swift Vol. 0
Johnlin
December 13, 2016
More Decks by Johnlin
See All by Johnlin
用 MLIR 實作 一個 Ruby IR (intermediate representation)
johnlinvc
0
320
Unearth Ruby builtin Gems 發掘 Ruby 的內建 Gems
johnlinvc
0
400
Ruby 型別檢查工具簡介
johnlinvc
0
630
Swift Actor 實作探索
johnlinvc
0
200
用 mruby 來寫跨平台工具
johnlinvc
0
130
Actor model 簡介
johnlinvc
0
240
一起玩 Helm 3
johnlinvc
1
160
為什麼 App 卡卡的
johnlinvc
2
1.3k
如何使用 byebug 來除錯 Ruby 程式
johnlinvc
0
270
Other Decks in Programming
See All in Programming
Built Our Own Background Agent at LayerX
layerx
PRO
10
5.7k
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
650
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
720
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
480
テーブルをDELETEした
yuzneri
0
150
全PRの83%がAIレビューだけでマージできるようになった開発組織はその後どうなったか
athug
1
1.8k
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
690
Claude Code全社展開のためにやったことn選~プラグイン302個・コミッター271人を支えるために~
kenchan
5
1.6k
進化を続けるGo toolsの現在地 / The Current State of Ever-Evolving Go Tools
hond0413
0
240
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
190
運用ダッシュボードの設計を誰も教えてくれないのだけどみなさんどうしてるんですか? - チームに監視するという文化を根付かせるための第一歩を踏みたい -
satoshi256kbyte
1
130
仕様駆動開発の消費期限
watany
20
8.7k
Featured
See All Featured
Google's AI Overviews - The New Search
badams
0
1.1k
sira's awesome portfolio website redesign presentation
elsirapls
0
330
A designer walks into a library…
pauljervisheath
211
24k
30 Presentation Tips
portentint
PRO
1
370
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
490
Designing for Performance
lara
611
70k
Optimising Largest Contentful Paint
csswizardry
37
3.9k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Technical Leadership for Architectural Decision Making
baasie
3
500
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Become a Pro
speakerdeck
PRO
31
6.2k
A better future with KSS
kneath
240
18k
Transcript
Design Patterns in Swift John Lin Vol 0
ॄኄੋDesign patterns? • Design patterns = ઃܭࣜɻ • ֤छೈᱪதৗݟతՍߏɼ㢨ଞ၇औҰݸ໊ࣈɻṜᒬࢠ ࠽ํศ౼ɻ
• औៃࣗݐஙላత໊ࣈɻ
࠷ஶ໊తઃܭࣜ၇ • Design Patterns: Elements of Reusable Object-Oriented Software
BY Erich Gamma , Richard Helm , Ralph Johnson , John Vlissides ؆ GoF(gang of four) ࢛ਓ㢨ɻ • ཫ໘ሜྃ23 छৗݟతC++݅ಋ ࣜɻ
ઃܭࣜత • Ṝຊॻੋඳड़C++ Smalltalk தৗݟతղܾ తํ๏ɻ • ୠੋሣଖଞޠݴိ㘸ɼṜࠣղܾํ๏҃ڐ༗ߋతղ ܾํ๏ɻ
Singleton • ݸఔࣜཫೳ༗Ұݸመᱪ(instance)ɻ • ৗ༻ိᙛ࡞ࢿݯཧऀ(manager)ɻ • መ࡞࣌धཁߟྀଟࣥߦॹ࣌త㐫گɻ
@interface Singleton : NSObject @end @implementation Singleton + (instancetype)sharedInstance {
static Singleton *sharedInstance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedInstance = [[Singleton alloc] init]; }); return sharedInstance; } @end
error: 'dispatch_once_t' is unavailable in Swift: Use lazily initialized globals
instead static var onceToken: dispatch_once_t = 0 ^~~~~~~~~~~~~~~
class Singleton { static let sharedInstance = Singleton() }
Iterator • భث • ༻ိଘऔҰݸ༰ث㚎తݩૉ • ෆधཁ༻ index
for i in 1...10 { print(i) } for c in
"hello world".characters { print(c) }
Swift తభث Protocol IteratorProtocol • ੋҰݸ Protocol • ༗ҰݸඞཁతവᏐ next()
• ᙛ༗ԼҰݸݩૉ࣌ɼճၚಹݸݩૉ • ᔒ༗ԼҰݸݩૉత࣌ީɼճၚ nil
Swift తجૅభث AnyIterator • ੋҰݸ Struct • আྃభ೭֎ؐ༗ଖଞతޭೳɻ
var s = "" let iter = AnyIterator<String> { let
c = s.characters.count % 2 == 0 ? "5" : "6" s = s + c return s.characters.count > 10 ? nil : s } for c in iter { print(c) } /* 5 56 … 565656565 5656565656 */
var s = "" let iter = AnyIterator<String> { let
c = s.characters.count % 2 == 0 ? "5" : "6" s = s + c return s.characters.count > 10 ? nil : s } for c in iter.filter({ $0.characters.count % 2 == 0 }) { print(c) } /* 56 5656 565656 56565656 5656565656 */
var s = "" let iter = AnyIterator<String> { let
c = s.characters.count % 2 == 0 ? "5" : "6" s = s + c return s.characters.count > 10 ? nil : s } for (idx,c) in iter.enumerated() { print("\(idx):\(c)") } /* 0:5 1:56 2:565 … 8:565656565 9:5656565656 */
ᩋ㟬తClass ೳඃభ • ঝ IteratorProtocol Sequence • typealias Element
= <ཁճၚతType> • ఆٛ next()
class PPAP : Sequence, IteratorProtocol { typealias Element = String
let stuffs = [ "APPLEPEN", "PINEAPPLEPEN", "PENPINEAPPLEAPPLEPEN"] var idx = 0 func next()-> String? { defer {idx += 1} guard idx < stuffs.count else { return nil } return stuffs[idx] } } let ppap = PPAP() for p in ppap { print(p) }
class PPAP : Sequence, IteratorProtocol { typealias Element = String
let stuffs = [ "APPLEPEN", "PINEAPPLEPEN", "PENPINEAPPLEAPPLEPEN"] var idx = 0 func next()-> String? { defer {idx += 1} guard idx < stuffs.count else { return nil } return stuffs[idx] } } let ppap = PPAP() for p in ppap { print(p) } /* APPLEPEN PINEAPPLEPEN PENPINEAPPLEAPPLEPEN */
let ppap = PPAP() for p in ppap { print(p)
}
Q&A