🌨Swiftレター #9🌨

2016/11/27

mono 
Swift・iOSコラム
15 min readNov 27, 2016

--

ブラウザで見るとURL展開されて見やすいのでオススメです👀

Swift

Swift らしいコードを目指そう

@es_kumagaiさんの、iOSオールスターズ 2での発表です。Swift API Design Guidelinesをかみ砕いた内容 + αな感じで、とても良い内容です👀

ご自身で詳細なレポートも書かれています:
iOS オールスターズ 2 で Swift らしさをたっぷり語ってきました。

このレポートに、他の方の発表資料もすべて掲載されています。

The RawRepresentable Protocol in Swift

enumのraw value構文は、RawRepresentableへの準拠の糖衣構文であること、その活用などについて触れられています。
上のスライドとそのレポート記事にも少し関連する内容です。

Protocol Oriented Programming is Not a Silver Bullet

タイトル通り、Swiftで推奨されているProtocol Oriented Programmingは銀の弾丸では無い、という内容で、同感でした。

Protocolの活用は有用ということは認めた上で、Protocol使わずに済むところでProtocolを使って無駄に複雑にしてる例が散見される、とのことで僕もたまにそういう違和感ある時があります。

What I Learned Building the PusherSwift Framework

特に、「Single-target build」の項目に書かれている、マルチプラットフォーム対応のライブラリを使う際に複数Targetを作らずに済む方法が参考になりました。

リストでは単体しか選べないが手打ちすれば複数指定可能

以前マルチプラットフォーム対応のライブラリ作ろうとした際、RxSwift参考にしたらTargetを複数作られていて、「そういうもんなのかな。面倒だ。」と思っていましたが、今Realm見たらそちらは上の単一Targetで済むやり方使っていました👀

プラットフォーム固有のAPI使いたい時は、次のようにすれば良さそうです。(if #availableはマクロではないのでこの用途ではNG)

#if os(iOS)
UIView()
#elseif os(macOS) // os(OSX)でもOK
NSView()
#endif

必ずしも単一Targetにすれば良いわけでは無く、プラットフォーム固有のAPIをたくさん使う場合は複数Target設定にした方が開発しやすいかもしれません。

Understanding Data Race Detection by Implementing it in Swift

LLVMのThread Sanitizer(データ競合検知)をSwiftで簡易実装した、という内容です。LLVMのThread SanitizerのSwift対応はXcode 8・Swift 3.0でなされるとWWDC 2016: Thread Sanitizer and Static Analysisでも発表されて使えるようになっていまして、「Thread SanitizerのSwift対応」ではありません。リポジトリはこちらです。

Swift 4のロードマップ — InfoQ

【追記】
SR-2582: Add -swift-version command line flagの対応により、 -swift-version 3 というフラグを付けるとSwift 3互換となるので、「Swift 3とのソース互換性確保」という表現で合っているかもしれません。(別の話として、コンパイラーバグ修正で動かなくなるコードの存在可能性もある状態ではあるのでいずれにせよ微妙ではありますが。)

InfoQのSwift 4に関する記事です。コンパクトにまとまってて良いですが、違和感覚えた記述が1つありました。

Swift 4の開発は2つのステージに分割されている。最初のステージにはSwift ABIの安定化に必要なすべての機能が含まれると同時に,Swift 3とのソース互換性も確保される。

「Swift 3–4はソースの破壊的変更を極力無いようにするけど少しありうる」というのが正しいはずです。少なくともSE-0144: Allow Single Dollar Sign as a Valid Identifierがリジェクトされたので、 $ を識別子として単体利用不可(どうしても使いたい場合は`$`とバッククォーテーションで囲む必要)になる、という破壊的変更がSwift 4に含まれることは決定しているはずです。

The Swift 4 release is designed around two primary goals: to provide source stability for Swift 3 code and to provide ABI stability for the Swift standard library. To that end, the Swift 4 release will be divided into two stages.
https://github.com/apple/swift-evolution/blob/master/README.md

Swift EvolutionのREADMEにも“provide source stability for Swift 3 code”と書かれてますが、「Swift 3とのソース互換性確保」という表現は違うかなと思いました。
(僕の間違えでしたら指摘お願いします🙇)

Swift Evolution

基本的に生情報を直接追わずに https://swiftweekly.github.io 見て面白そうなトピックを深追い、という感じで書いていましたが、#48がまだ配信されていなくて困ったので今回はボリューム少ないです( ´・‿・`)

Swift 3.1でジェネリクス型のネストが可能に

CHANGELOGにも記載済みです。こちらのPull Requestで対応されました。

iOS

iOS: Custom Modality

iOSのモーダル表示にはいくつかパターンがあります(モーダルビュー、アラートビュー、アクションシート、など)が、その使い分けについて書かれています。特にフローチャートがあるのが良いなと思いました。

ツール

facebookincubator/Keyframes

Adobe After Effectsでベクターアニメーションを作成し、そこからFacebookのリアクションアニメーションのようなスケーラブルで軽いアニメーションに変換してくれるライブラリです。

  1. Adobe After Effectsでベクターアニメーションを作成
  2. リポジトリに同梱されている変換スクリプトでJSONを生成(iOS・Android・JavaScript共通)
  3. それぞれのプラットフォーム用のライブラリを使ってアニメーション実行(iOSの場合は、JSONファイルを読み込んでそのベクターオブジェクトを所望のlayerにセット)

Adobe After Effects使いこなせる場合(あるいは、そういうデザイナーさんと連携している場合)は、なかなか良さそうなツールに思いました。

Keyframes: Delivering scalable, high-quality animations to mobile clientsという解説記事も公開されています。

Eject — from Interface Builder

xibファイルをD&Dすると、Swiftコードに変換してくれるツールです。試しに実コードを入れたらきちんと変換してくれました。ちゃんと手で書いたコードに比べるとベタ書きで量が多くなってしまいそうな気はします。コマンドラインツールも用意してくれている(GitHubリポジトリ参照)ので、手元のxibファイルを一斉変換することも、うまく動けば出来そうです。個人的には、Storyboard・Xibの両方用いてAutoLayoutで書いていますが、Storyboard・Xibじゃなくてコードの方が良いかなとも最近思い始めてきています🤔
(AutoLayoutは、個人的には使うべきだと思っています。)

JohnSundell/SwiftPlate

swiftplateと打って、対話式コマンドに答えていくと、CocoaPods・Carthage・SwiftPM対応のクロスプラットフォーム(iOS・macOS・watchOS・tvOS)対応ライブラリのひな形を生成してくれます。地味に面倒なので、かなり便利に思いました。ただ、クロスプラットフォーム対応の仕方が複数Target方式でした。基本的には、上でも書いた単一Target方式の方が取り回ししやすいかなと思っているので、そこだけが個人的には残念でした(そういうオプション追加のPull Requestするなどありですね)。

twostraws/swiftgd

libgdのラッパーです。Linux上でのグラフィックレンダリング用途に開発されたとのことです。12月5日に発売するサーバーサイドSwiftの本の作者が書かれています。

リリース

先週はApple関連のアップデートは特に無かったです。

Xcode 8.2 beta 2

beta 2リリースは14日でしたが、そこにXcode 8 にて差分ビルドが効かなく(効きにくく?)なった問題の修正が含まれていました。GM版・正式版リリースが待ち遠しいですね🤕

Xcode will not rebuild an entire target when only small changes have occurred. (28892475)
http://adcdownload.apple.com/Developer_Tools/Xcode_8.2_beta_2/Release_Notes_for_Xcode_8.2_beta_2.pdf

Xcode8に移行してビルドが遅くなったのを直すにもコメントしておきました。

その他

ApressのApple・iOS書籍がセール中(11月28日まで)

$30–40ほどの書籍が$9.99となっています。

Swift Tweets

@koherさん主催のSwift Tweetsという、新しい試みのTwitter上での勉強会が2017年1月14日に開かれます🎉

Swift Tweets は Twitter 上で開催される Swift に関する Tweetup です。 4 人の発表者が 30 分の持ち時間(約 60 ツイート)で、 Swift について発表します。

Twitter上での開催ですが、こちらから参加登録する方式となっています。

Q. Twitter で開催されるなら何のために参加登録が必要なの?

A. オンラインだと誰が参加していて誰が参加していないのかが曖昧になりがちです。参加者に「この時間はこれに参加することに費やしてます」ということを表明して時間を確保していただくことで、オフラインのカンファレンスや勉強会のように参加者間で交流がしやすくなることを期待しています。

僕も3番手で発表するみたいなので、ネタを考えなくては🤔

筆者の小話

Swiftレター始めて2ヶ月ほどですが、Publicationのフォロワーが200人超えました🎉ありがとうございます🙇
ちなみに、Publicationなので、興味ある方いればWRITERとしてのご参加歓迎です(Swiftレター自体は自分で書いていくつもりですが、エンジニアの家庭運用Tipsやぶさん記事のようにPublicationに紐付いた記事投稿歓迎という意味です)。 jpmarthaさんが興味ありそうだったのでWRITERSに仲間入りしました🎉

昨日は紅葉見に行ってきました( ´・‿・`) Mediumをアルバムぽく使うのも良いなと最近思っています( ´・‿・`)

バックナンバーはこちらから一覧出来ます。

↓アカウントやSwift・iOSコラムPublicationフォローしていただけるとありがたいです🙇 PublicationフォローしていただけるとこのSwiftレターのメール通知も届くようになります( ´・‿・`)

--

--