RawValueがIntのenumを何かのインデックスとして使いたい時はhashValueじゃなくてrawValueを使いましょう

そうそう遭遇はしないと思いつつ、Swift 4.2になるとハッシュシードのランダム化により問題が起き得ます。

  • RawValueがIntのenumであっても、rawValueがそのままhashValueではなくなる
    • Swift 4.1までは、rawValue == hashValueという挙動だった(実装依存
  • 実行ごとにハッシュ値は変わる

hashValueは「ダメ。ゼッタイ。

The standard library now uses a high-quality, randomly seeded, universal hash function, represented by the new Hasher struct. Random seeding varies the result of hashValue on each execution of a program, improving the reliability of the standard library's hashed collections, Set and Dictionary. In particular, random seeding enables better protection against (accidental or deliberate) hash-flooding attacks.

https://developer.apple.com/documentation/xcode_release_notes/xcode_10_release_notes/swift_4_2_release_notes_for_xcode_10

CocoaPodsにtest_specというのがあるのを今更ながら知った

CocoaPods 1.6.0 Betaのブログ記事(2018年8月)を今更ながら読んでいたら、s.test_specという定義ができるのを遅まきながら知った。

Pod::Spec.new do |s|
  # ... rest of root spec entries go here

  # Unit Test Sources - Those do not require an app host to run. 
  # They also require 'OCMock' dependency.
  s.test_spec 'Tests' do |test_spec|
    test_spec.source_files = 'Tests/**/*.{h,m}'
    test_spec.dependency 'OCMock'
  end

  # SnapShot Tests Sources - Those *do* require an app host to run.
  s.test_spec 'SnapshotTests' do |test_spec|
    test_spec.requires_app_host = true
    test_spec.source_files = 'SnapshotTests/**/*.{h,m}'
  end

おまけで、cocoapods-generateという、podspecからXcodeのプロジェクトを生成してくれるプラグインも紹介されていてよさそうだった。SwiftPM(Swift Package Manager)の$ swift package generate-xcodeprojと一緒の感じですね。

Xcodeのプロジェクト生成だとXcodeGenという、YamlJSONの定義から生成するツールもある。

2018年振り返り

総括

今年は割と潜っていた感じがするので、来年はもっとアクティブに活動できるといいですね。それと今年は新しくリリースした・新たにコミッターになったOSSがなかった年だったっぽいので、何か新しいものに関わったり、Swiftにももっとコミットしていきたいです。沢山旅行もしたいしお金も欲しいしお酒も飲みたい!✈️💰🍻

React NativeとTypeScript 3.1の相性が悪い

相性が悪いというかStyleSheet.create周りで型エラーになってしまう。

github.com

github.com

Bugラベルは付けられていて、TypeScript 3.2を待つ必要がありそう。

Swift 4.2のBatch Modeについて

https://swift.org/blog/swift-4-2-released/Support for batch mode compilation resulting in faster build timesと言及されているものについて。

この件はWWDC 2018のセッションでも紹介がありました: https://developer.apple.com/videos/play/wwdc2018/401

  • これまでSwiftのビルドは簡単にまとめると、デバッグビルド(インクリメンタルビルド)では1ファイルずつコンパイル、リリースビルドではWhole Moduleモードと呼ばれるモードで、モジュール内の全ファイルを一度にまとめてコンパイル、という感じであった
    • Whole Moduleモードでは、モジュール内で継承されていないclassfinalが付いていなくても、実質的にfinal扱いするという最適化もできたりする
  • デバッグビルドが1ファイルずつコンパイルするのに比べて、Whole Moduleモードでまとめてコンパイルする方が速いケースがあった
    • このcompilation modeは最適化のモードとは分離されていて、SWIFT_COMPILATION_MODEというビルド設定で変更できる
    • 以前まではWhole Module Optimizationと呼ばれる最適化として提供されていたが、Swift 4.1(Xcode 9.3)からcompilation modeと最適化のモードが分離されるようになった
  • Swift 4.2からはインクリメンタルビルドにBatch Modeというものが実装され、デバッグビルドでも複数ファイル単位でコンパイルできるようになり、ビルドが高速化した

デバッグビルドが速くなって嬉しいですね。

iOSDC Japan 2018でCarthageのLTをします #iosdc

こんにちは。すでに会社のDeveloper Blogでも公開されていますが、iOSDC Japan 2018でCarthageの最新情報についてLTをします。

iOSアプリ開発に欠かせないパッケージマネージャーのCarthageですが、その新機能になかなか気付かないこともあるでしょう。本LTでは、昨年のiOSDC Japanからの1年分のアップデートの中から要注目の箇所をピックアップして紹介することで、開発者の皆様の日々の開発体験の向上に寄与したいと思います。

最近なかなかリソースを取れずにCarthageの進捗があまり芳しくないのは事実ですが、この一年分を振り返ってみるとそれなりの内容にはなるかと思います。

iOSDC Japanでは3年連続のLT登壇となります。今年もきっとLTタイムにはビールなどが用意されていると思うので、楽しい気分でワイワイやっていきましょう🍻

過去のLT情報

Swift Package Managerの略称はSwiftPMが推奨

SPMという表記をたまに見かけるけど、Swiftであることがよく分からないですよね。

(@aciidb0mb3rさんはAppleの人で、Swift Package Managetの主要開発者の一人です)