開発環境
$ swift --version swift-driver version: 1.75.2 Apple Swift version 5.8 (swiftlang-5.8.0.124.2 clang-1403.0.22.11.100) Target: arm64-apple-macosx13.0
TL;DR
Q: Swiftのstructでstatic propertyを使うメリットは?
A: static propertyはインスタンスのメモリ領域に格納されないため、メモリ使用量の観点で経済的
struct Hoge { let a = 1 static let b = 2 } let hoge = Hoge() MemoryLayout.size(ofValue: hoge) // 8 // struct Hogeのインスタンスのメモリ使用量は、 // 定数a(Int == Int64)の8byte分のみ。
モチベーション
きっかけはswift-evolutionの 0380-if-switch-expressions を読んでいた時だった。
↓
Swiftの any
とsome
、any
が実行時に型が決まり、some
はコンパイル時に型が決まる、みたいな適当な理解だな〜
↓
Swift 5.6のany、Swift 5.7のsomeと、Swiftらしいprotocolの使い方 - YouTube にたどり着く。
↓
structのメモリ使用量を確認するために MemoryLayout.size(ofValue:)
が使われることを知る。
↓
そういえば、Swiftのstructでインスタンスごとの共通の値はstatic propertyで定義した方が良いよね、というのは感覚では分かるが、なぜそうなのかは MemoryLayout.size(ofValue:)
を使ってインスタンスのメモリ使用量を見れば良いのでは。
おわりに
Swiftに関して知らないことが多い。対応としてswift-evolutionで興味のあるプロポーザルを読み進めている。今回みたいな気づきが得られて良かった。
知らないことが多くて先は長いなと少し落ち込んだが、少しずつでも理解の幅を広げていこう。
参考
- swift-evolution/0380-if-switch-expressions.md at main · apple/swift-evolution
- Swift 5.6のany、Swift 5.7のsomeと、Swiftらしいprotocolの使い方 - YouTube
- SwiftUI を理解するために必要な Swift 5.1 の新機能 (some View編) - Speaker Deck
- 32 ビット App と macOS High Sierra 10.13.4 以降の互換性 - Apple サポート (日本)
- MemoryLayout | Apple Developer Documentation
- Int | Apple Developer Documentation