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
Making Your App Static
Search
Yusei Nishiyama
July 14, 2015
Technology
13
4.1k
Making Your App Static
Making Your App Static with Swift
Yusei Nishiyama
July 14, 2015
Tweet
Share
More Decks by Yusei Nishiyama
See All by Yusei Nishiyama
Continuous Mobile App Delivery
yuseinishiyama
0
690
Working at Cookpad UK
yuseinishiyama
2
3.4k
Building iOS apps at scale (Mobilization)
yuseinishiyama
4
1.7k
Working at Scale
yuseinishiyama
3
780
Building iOS apps at scale
yuseinishiyama
2
1.2k
Reduce Build Times and Get Home Eariler
yuseinishiyama
2
730
How to make your app international
yuseinishiyama
3
7.5k
Safer Networking Layer With Swift
yuseinishiyama
0
270
え!? Swift使ってるのにそんな書きかたしてるのですか!?
yuseinishiyama
28
9k
Other Decks in Technology
See All in Technology
What is DRE? - Road to SRE NEXT@広島
chanyou0311
3
630
コンテナ・K8s研修 - 前半 コンテナ基礎・ハンズオン【MIXI 24新卒技術研修】
mixi_engineers
PRO
0
170
たくさん本を読んだけど 1年後には綺麗サッパリ!を乗り越えて 学習の鬼になるぞ👹
yum3
0
160
CTOから見た事業開発とプロダクト開発 / My Perspective on Business and Product Development as CTO
keisuke69
4
960
テストケースの自動生成に生成AIの導入を試みた話と生成AIによる今後の期待
shift_evolve
0
190
サービス開発を前に進めるために 新米リードエンジニアが 取り組んだこと / Steps Taken by a Novice Lead Engineer to Advance Service Development
nologyance
0
180
累計ダウンロード数1億8000万を超えるアプリケーションプラットフォームのレガシーシステム脱却とモダン化への道
kmitsuhashi
0
120
How to Think Like a Performance Engineer
csswizardry
4
590
LINE WORKSへ簡単通知!Incoming Webhookアプリの紹介
mmclsntr
0
110
エンジニアリングマネージャーはどう学んでいくのか #devsumi / How Do Engineering Managers Continue to Learn and Grow?
expajp
4
1.3k
JBUG岡山 #6 WordCamp男木島の チームビルディング
takeshifurusato
0
150
Classmethod Odyssey 登壇資料
yamahiro
0
390
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
63
4.2k
Robots, Beer and Maslow
schacon
PRO
157
8.1k
Making the Leap to Tech Lead
cromwellryan
127
8.7k
Leading Effective Engineering Teams 2024
addyosmani
3
300
Become a Pro
speakerdeck
PRO
15
4.8k
Building Adaptive Systems
keathley
34
2k
Creatively Recalculating Your Daily Design Routine
revolveconf
214
11k
How To Stay Up To Date on Web Technology
chriscoyier
784
250k
The Art of Programming - Codeland 2020
erikaheidi
48
13k
Producing Creativity
orderedlist
PRO
340
39k
Why You Should Never Use an ORM
jnunemaker
PRO
51
8.9k
Optimising Largest Contentful Paint
csswizardry
18
2.6k
Transcript
.BLJOH:PVS "QQ4UBUJD :VTFJ/JTIJZBNB !ZVTFJOJTIJZBNB QPUBUPUJQT
8IPBN* w :VTFJ/JTIJZBNB !ZVTFJOJTIJZBNB w J04EFWFMPQFS ZFBST w $PPLQBE
w *OUFSOBUJPOBMHSPVQ w -FBSOJOH&OHMJTI
(MPCBM
/PXXFIBWFB TUBUJDMBOHVBHFʜ
5IFSFTUJMM SFNBJOTBMPUPG EZOBNJDQBSU
6*7JFX$POUSPMMFS
let storyBoard = UIStoryboard(name: "Main", bundle: nil) let vc =
storyBoard.instantiateViewControllerWithIdentifier("FooBar") as! FooBarViewController navigationController?.pushViewController(vc, animated: true) class FooBarViewController : UIViewController {}
$PEF(FOFSBUPS wLS[Z[BOPXTLJN/BUBMJF wTRVBSFPCKDDPEFHFOVUJMT wQBVMTBNVFMT4#$POTUBOUT
4UPSZCPBSE 7JFX$POUSPMMFS w $MBTTOBNF'JMFOBNF 4UPSZCPBSE ‣ 'PP#BS7JFX$POUSPMMFSTXJGU ‣ 'PP#BS7JFX$POUSPMMFSTUPSZCPBSE
w 4UPSZCPBSE&OUSZ1PJOU class FooBarViewController : UIViewController { var aProperty: Int?
protocol StoryboardInstantiable {} func instantiate<T: StoryboardInstantiable>(_: T.Type) -> T {
let storyBoard = UIStoryboard(name: TypeNameFromType(T), bundle: nil) return storyBoard.instantiateInitialViewController() as! T } extension FooBarViewController : StoryboardInstantiable {} let vc = instantiate(FooBarViewController) vc.aProperty = 1 navigationController?.pushViewController(vc, animated: true) 1SPUPDPM (MPCBM'VODUJPO
1SPUPDPM&YUFOTJPO protocol StoryboardInstantiable {} extension StoryboardInstantiable { static func instantiate()
-> Self { let storyBoard = UIStoryboard(name: TypeNameFromType(Self), bundle: nil) return storyBoard.instantiateInitialViewController() as! Self } } extension FooBarViewController : StoryboardInstantiable {} let vc = FooBarViewController.instantiate() vc.aProperty = 1 4XJGU
5ZQF$POTUSBJOUT extension StoryboardInstantiable where Self: UIViewController { static func instantiate()
-> Self { let storyBoard = UIStoryboard(name: TypeNameFromType(Self), bundle: nil) return storyBoard.instantiateInitialViewController() as! Self } } class SomeClass : StoryboardInstantiable {} SomeClass.instantiate() // Compile error
)PXUPHFU BUZQFOBNF
0CKFDUJWF$ NSString * className = NSStringFromClass([FooBarViewController class]); NSLog(@"Class name is
%@", className);
4XJGU let classString = NSStringFromClass(FooBarViewController) // => Potatotips.FooBarViewController classString.componentsSeparatedByString(".").last! //
=> FooBarViewController
/FTUFE$MBTT class Hoge { class FooBarViewController : UIViewController {} }
println(Hoge.FooBarViewController.self) // => Potatotips.Hoge.FooBarViewController println(NSStringFromClass(Hoge.FooBarViewController.self)) // => _TtCC10Potatotips4Hoge20FooBarViewController println(Hoge.FooBarViewController.self.description()) // => _TtCC10Potatotips4Hoge20FooBarViewController println(Hoge.FooBarViewController.self.debugDescription()) // => _TtCC10Potatotips4Hoge20FooBarViewController
None
.BOHMFE/BNF $ xcrun swift-demangle _TtCC10Potatotips4Hoge20FooBarViewController _TtCC10Potatotips4Hoge20FooBarViewController ---> Potatotips.Hoge.FooBarViewController _T t
CC 10Potatotips 4Hoge 20FoobarViewController Swift global symbol Type 2 nested class Module name (10 characters) Class name Class name
%FNBOHMFE5ZQF/BNF println(reflect(Hoge.FooBarViewController.self).summary) // => Potatotips.Hoge.FooBarViewController println(toString(Hoge.FooBarViewController.self)) // => Potatotips.Hoge.FooBarViewController
TUSVDUPSFOVN struct A { struct B { struct C {}
} } enum X { enum Y {} } println(reflect(A.B.C.self).summary) // => Potatotips.A.B.C println(reflect(X.Y.self).summary) // => Potatotips.X.Y println(toString(A.B.C.self)) // => Potatotips.A.B.C println(toString(X.Y.self)) // => Potatotips.X.Y
4XJGU print(String(Hoge.FooBarViewController.self)) // => Potatotips.Hoge.FooBarViewController
6*5BCMF7JFX
override func tableView( tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{ let cell = tableView.dequeueReusableCellWithIdentifier( "Cell", forIndexPath: indexPath) as! FooBarCell /4*OEFY1BUI
NSIndexPath Meaning
enum Section { case Birds(row: Bird), Fishes(row: Fish) enum Bird:
Int { case Parrot, Owl, Woodpeckers } enum Fish: Int { case Carp, Dragonfish } init?(indexPath: NSIndexPath) { switch (indexPath.section, indexPath.row) { case (0, let x): guard let bird = Bird(rawValue: x) else { return nil } self = Birds(row: bird) case (1, let x): guard let fish = Fish(rawValue: x) else { return nil } self = Fishes(row: fish) default: return nil } } var indexPath: NSIndexPath { switch self { case .Birds(let row): return NSIndexPath(forRow: row.rawValue, inSection: 0) case .Fishes(let row): return NSIndexPath(forRow: row.rawValue, inSection: 1) } } }
override func tableView( tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{ let title: String if let section = Section(indexPath: indexPath) { switch section { case .Birds(row: .Owl): title = "Owl" default: title = "Other" } } else { title = "Invalid" } // ...
6*5BCMF7JFX$FMM override func tableView( tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->
UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier( "Cell", forIndexPath: indexPath) as! FooBarCell
$MBTTOBNF 'JMFOBNF OJC *EFOUJpFS
extension UITableView { func registerNibForCellWithType<T: UITableViewCell>(type: T.Type) { let className
= TypeNameFromType(T) let nib = UINib(nibName: className, bundle: nil) registerNib(nib, forCellReuseIdentifier: className) } func registerClassForCellWithType<T: UITableViewCell>(type: T.Type) { let className = TypeNameFromType(T) registerClass(T.self, forCellReuseIdentifier: className) } func dequeueReusableCellWithType<T: UITableViewCell>( type: T.Type, forIndexPath indexPath: NSIndexPath) -> T { return dequeueReusableCellWithIdentifier( TypeNameFromType(T), forIndexPath: indexPath) as! T } } 3FHJTUFSBOE %FRVFVFCZ5ZQF
class FooBarCell : UITableViewCell { @IBOutlet weak var label: UILabel!
} // Register let tableView = UITableView() tableView.registerNibForCellWithType(FooBarCell) // Dequeue let cell = tableView.dequeueReusableCellWithType( FooBarCell.self, forIndexPath: indexPath) cell.label.text = title 1VUUIFNJOUP "DUJPO
4VNNBSZ
w'JOETPNFUIJOHXSPOHPO lDPNQJMFUJNFz w(FOFSBUJOHTUSJOHTGSPN UZQFT w3FEVDFDPEFXJUIHFOFSJDT
8FBSFIJSJOH
"OZ2VFTUJPOT