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
Swift on the ObjC #shibuyaswift
Search
ainame
June 08, 2016
Programming
920
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Swift on the ObjC #shibuyaswift
ainame
June 08, 2016
More Decks by ainame
See All by ainame
Swift 5.7で変わる正規表現を試してみよう
ainame
4
7.7k
iOSDC 2021 - App Store用スクリーンショットの自動生成をアラビア語対応してSwiftUIで実装してみた
ainame
0
6k
DNN/GPU with Ruby #rubykaigi
ainame
2
3.3k
Server Side Swift実用性評価 2017 #iosdc #b
ainame
3
4.5k
Process tons of jobs with Swift
ainame
0
1.9k
家族アルバムみてね 開発風景 #realm_jp
ainame
4
4.2k
iOSで無限バックグラウンドアップロード(に挑戦してみた話)
ainame
2
5.3k
リファクタリングとtsort
ainame
1
1.8k
RubyMotionについて #mixiwwdc
ainame
2
450
Other Decks in Programming
See All in Programming
これからAgentCoreを触る方へトレンドはGatewayです
har1101
6
460
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
380
任せる範囲はこう広がった / How the Scope of AI Delegation Has Expanded
nrslib
1
230
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
1k
技術記事、 専門家としてのプログラマ、 言語化
mizchi
14
7.3k
Spec Driven Development | AI Summit Lisbon
danielsogl
PRO
0
230
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
150
AI 輔助遺留系統現代化的經驗分享
jame2408
1
1.2k
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
610
Contextとはなにか
chiroruxx
1
390
act1-costs.pdf
sumedhbala
0
160
The NotImplementedError Problem in Ruby
koic
1
1.1k
Featured
See All Featured
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
72
40k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.5k
Code Reviewing Like a Champion
maltzj
528
40k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
GitHub's CSS Performance
jonrohan
1033
470k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Accessibility Awareness
sabderemane
1
150
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6k
For a Future-Friendly Web
brad_frost
183
10k
Everyday Curiosity
cassininazir
0
250
The untapped power of vector embeddings
frankvandijk
2
1.8k
Transcript
Swift on the ObjC Shibuya.swift#4 • @ainame (Satoshi NAMAI) •
株式会社ミクシィ • 家族アルバムみてね作ってます
Question あなたのプロジェクトにはまだObjective-Cのコードがありますか?
Contents みてねチームにおいて、昨年10月頃からObjCで書かれたコードベースの上にSwift を書いてきた際に取り組んできたことを話します。
Policy ユーザーへの価値提供が第一 • 全コードを一気にSwiftに置き換えることはしない • 新規に書く箇所はSwift • 大きく仕様変更が入る際には画面単位でSwiftに置き換えつつ レガシーな設計から良い設計に合わせていく
Study Swift by WWDC videos 毎週水曜にランチタイムにみんなで動画を見てSwift2について学んだ • What's New in
Swift • Protocol-Oriented Programming in Swift • Building Better Apps with Value Types in Swift • Swift and Objective-C Interoperability see: 動画で学ぶモダンなiOS/Androidアプリ開発技術 - ainameの日記 井戸端iOS飯で過去に見た動画まとめ
Get started! • Bridging HeaderでObjCのコードをimportしてSwiftを書き始める • SwiftのStructやEnumはObjC側では使えないのでほとんど使わず、NSObject を継承 or @objcでClassを書いてく
• ObjCの巨大なViewControllerに機能追加する際には同じファイル名で extensionとして実装(⌥ + ↑ で切り替え可能) ◦ SomeViewController.{h,m,swift}という感じで3ファイルが存在している状態
Xcode’s auto-completion •Swift上でObjcのクラスの補完が効かなくなった Clean、Derived Data削除も効果なし importの仕方を修正したら復活 ✖ #import <GAI.h> ◯
#import <GoogleAnalytics/GAI.h> see: http://stackoverflow.com/a/35431971
Swifty? • さらに動画でSwiftっぽい書き方を学ぶ • "Feet in Both Worlds: From Objective-C
to Swift" by Andy Matuschak • Let's Play: Refactor the Mega Controller!
Example // enumを使ってUIの機能追加したい enum Icon { case Color(UIColor) case Image(UIImage)
} class IconView: UIView { init(icon: Icon) { … } } // ObjC用の箱を用意しておく class Box<T> { let value: T init(_ value: T) { self.value = value } } // ObjCのクラスには箱だけを id型としておいておく @interface LegacyViewController @property (readwrite, strong) id /* Box<SomeEnum> */ _icon; @end // 箱から取り出し用の propertyを宣言して extension LegacyViewController { var icon: Icon { get { return (_icon as! Box<Icon>).value } set { _icon = Box(newValue) } } // すっきりした実装ができる func showProfileWithIcon(icon: Icon) } どうしてもSwiftでしか使えないやつをObjCのViewControllerに もたせたい場合はBoxパターンを利用
Nullability & Lightweight Generics • SwiftでObjCのメソッドを呼ぶ際にNullabilityを考慮してなくて事故る • Bridging Headerでimportされているものには必ずNullability +
Lightweight Genericsを指定するルールに
Nullability & Lightweight Generics - Pitfall SwiftからObjCに公開するメソッドはnilが入り込みやすい (Swift側で参照すると落ちる) @objc func
doSomething(string: String) ← 普通のSwiftのメソッ ド---------------------------------------------------------- NSString *str = [self textField.text]; ← TextFieldからnullableなNSStringをとる [obj doSomething:str]; ← Swiftのメソッドにnullableなやつ渡す❌
Carthage & Dynamic Framework • SwiftベースのライブラリはDynamic Frameworkとして取り込んでいる • Cocoapodsはuse_frameworks!できなかった時ように残してある (当時GoogleAnalytics
SDKとか出来なかったけど今は対応している?) • carthage bootstrapは初回こそ時間かかるものの一度ビルドすると再ビルドせ ず済むので良い • CircleCI上でRxSwiftのビルド終わらない問題 ◦ CI上でビルドせず最初から s3にビルド済みキャッシュを自前で置く戦略で・・・ ◦ aws s3 sync s3://BUCKET/`md5 Cartfile.resolved | awk '{ print $4; }'` Carthage/Build/iOS
Introduce swifty libraries 置き換え系 • SDWebImageから拝借したdispatch_sync_main_safe -> duemunk/Async • DateTools
-> malcommac/SwiftDate • PromiseKit & KVOController -> ReactiveX/RxSwift 新規導入系 • antitypical/Result, lyft/mapper, ra1028/Former
NSCoding & Unit testing シリアライズ処理は辛い(怖い) • @objc(CLASS NAME)を利用してSwift化 • Module名が異なるとクラス名が一緒でもforce
downcastでクラッシュ 1. テスト対象クラスをTestのTargetにも追加 2. TestのtargetのModule名をアプリのTargetのModule名にして回避 • アプリのTargetをModule化して@testable importする方が一般的っぽい?
Example @interface MTNFoo: NSObject<NSCoding> @property(nonatomic) MTNBar *bar; .... @end @implementation
MTNFoo - (instancetype)initWithCoder:(NSCoder *)aDecoder { self = [self init]; if (self) { _bar= [aDecoder ecodeObjectForKey:@"bar"]; } return self } @end @objc(MTNFoo) class MTNFoo: NSObjcet, NSCoding { var bar:MTNBar … required init?(coder aDecoder: NSCoder) { self.bar = aDecoder.decodeObjectForKey("bar") as! MTNBar } } MiteneTests -> Mitene Could not cast value of type MiteneTests.MTNBar' (0x13218604) to 'Mitene.MTNBar'
SwiftLint • SwiftLintをフォーマッター的に利用 • まだレビュー用途には利用できてない • チームメンバーがXcodePlugin書いてくれた ◦ ypresto/SwiftLintXcode: An
Xcode plug-in to format your code using SwiftLint.
Current Status まだまだこれから
まとめ • Swiftに慣れるのにみんなで動画を見るのはいいぞ • Nullability頑張って定義していこう • Xcodeの補完効かなくなると仕事出来なくなるので頑張って解決しよう • ObjCと混ぜたプロジェクトでテスト書くの大変っぽい?
Enjoy Swift! See you next week at WWDC!