とりあえずやってみればいいじゃん

とりあえずやってみればいいじゃん

エンジニア関連のことについてつらつら書くブログ

3/2 SwiftのPointy Bits #tryswiftconf

try!Swiftのセッションまとめシリーズです。Nate Cookさんの「Swift’s Pointy Bits」についての記事になります。

資料

スライド共有サービスには上がっていないようです。try!Swift2017のslackの#slideには上がっているので、そちらをご参照ください。

内容

  • いろんなポインタがあって、どのように機能するのかの話
  • Swiftを安全にしているのは何なのか
    • 安全はどういう意味?
      • 絶対にクラッシュしないこと?
      • オプショナルが大きな役割を果たしている
let ages = [13.3, 17.5, 18.9, 21.2]
let firstPlusOne = ages.first! + 1
  • 上記の場合の安全策は?
    • 配列が空だとクラッシュする
    • force unwrapするとクラッシュする
  • 数値を0で割るとクラッシュする
let ages = [13.3, 17.5, 18.9, 21.2]
let last = ages[4]
  • 上記のコードの場合、存在しないindexを参照しているのでクラッシュする
  • こんな言語が安全なのか?
  • Swiftの安全性はクラッシュから守るという意味ではないのか、では何なのか
  • 逆に、クラッシュしないとどうなるか
    • プログラムに問題が発生してもわからない
  • つまり、Swiftの安全性とは予期せぬふるまいから守ってくれること
  • 他の形で安全性を担保したい時
    • Unsafeを使用する
    • 言語が提供する安全性を放棄して自分で書く
    • unsafeが付いているとイラッとするけど諦めて自分で責任を追う
  • まずメモリそのものをみてみる
  • メモリは型と関数で占められる
  • 1と0でいっぱいになってしまうので8ずつのグループにする16新法へ
  • 各行は8バイト、もしくは64ビット
  • メモリの全ての場所には値がある
  • アドレスも16進数
  • 各行は+8になっている
  • unsafeポインタをを使うと値そのものではなくアドレスへの参照をする
  • ポインタは値そのものではない
  • 4つのポインタ型がある
    • 2つの軸で見ることができる
    • ①型がついているか
      • Type(型付き):UnsafePointer, UnsafeMutablePointer
      • Raw(型なし):UnsafeRawPointer, UnsafeMutableRawPointer
    • ②Mutability
      • インスタンスレベルでコントロールするわけではなく、typeレベルでコントロールする
      • Immutable:UnsafePointer, UnsafeRawPointer
      • Mutable:UnsafeMutablePointer, UnsafeMutableRawPointer
  • UnsafePointerTypeをどのような時に使うか
    • CのAPIを使う
    • ※スライド参照
  • バブルソート
    • パフォーマンスを得ることができる
  • ポインタの誤用例
    • ポインタをエスケープする
    • Inplicit versionなしで使用しない

Q&A

  • シュームメモリーバウンドとバウンドメモリの違い
    • (書き取れませんでした)

その他このトークに関する情報源

togetter

Swift's Pointy Bits #tryswiftconf - Togetterまとめ