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.3k
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
850
Working at Cookpad UK
yuseinishiyama
1
3.6k
Building iOS apps at scale (Mobilization)
yuseinishiyama
4
1.9k
Working at Scale
yuseinishiyama
3
840
Building iOS apps at scale
yuseinishiyama
2
1.5k
Reduce Build Times and Get Home Eariler
yuseinishiyama
2
830
How to make your app international
yuseinishiyama
3
7.6k
Safer Networking Layer With Swift
yuseinishiyama
0
310
え!? Swift使ってるのにそんな書きかたしてるのですか!?
yuseinishiyama
28
9.2k
Other Decks in Technology
See All in Technology
Strands Agents & Bedrock AgentCoreを1分でおさらい
minorun365
PRO
6
230
モバイルゲームの開発を支える基盤の歩み ~再現性のある開発ラインを量産する秘訣~
qualiarts
0
1.1k
Perlアプリケーションで トレースを実装するまでの 工夫と苦労話
masayoshi
1
410
dipにおけるSRE変革の軌跡
dip_tech
PRO
1
230
AI によるドキュメント処理を加速するためのOCR 結果の永続化と再利用戦略
tomoaki25
0
390
「育てる」サーバーレス 〜チーム開発研修で学んだ、小さく始めて大きく拡張するAWS設計〜
yu_kod
1
250
Nx × AI によるモノレポ活用 〜コードジェネレーター編〜
puku0x
0
330
VLMサービスを用いた請求書データ化検証 / SaaSxML_Session_1
sansan_randd
0
210
風が吹けばWHOISが使えなくなる~なぜWHOIS・RDAPはサーバー証明書のメール認証に使えなくなったのか~
orangemorishita
15
5.4k
マルチモーダル基盤モデルに基づく動画と音の解析技術
lycorptech_jp
PRO
4
500
Segment Anything Modelの最新動向:SAM2とその発展系
tenten0727
0
300
私とAWSとの関わりの歩み~意志あるところに道は開けるかも?~
nagisa53
1
160
Featured
See All Featured
Adopting Sorbet at Scale
ufuk
77
9.5k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.8k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
8
420
Making the Leap to Tech Lead
cromwellryan
134
9.5k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
Become a Pro
speakerdeck
PRO
29
5.5k
Docker and Python
trallard
45
3.5k
Optimizing for Happiness
mojombo
379
70k
Why Our Code Smells
bkeepers
PRO
337
57k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.6k
Navigating Team Friction
lara
188
15k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
126
53k
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