なんとなく使っていた computed property と func。
気にはなっていたので。
以下の条件に当てはまる場合は、functionよりpropertyを使う方がよい。
- 例外を投げない
- 計算量が少ない(または初回実行時にキャッシュされる)。
- オブジェクトの状態が変化していない場合、何度呼び出しても同じ結果を返す。
(O(1)ではないcomputed propertyではその旨をドキュメント(コメント)に明記すること。 プロパティアクセスは一般的に計算コストが安価だと見なされるので、そうでない場合はその旨の明記が必要である。)
👉 [Swift] FunctionとComputed Propertyの使い分けの基準 #Swift - Qiita
* Top Hightlight
A property expresses an inherent quality of an instance, while a method performs an action.プロパティはインスタンスの固有の品質を表現し、メソッドはアクションを実行します。
👉 Functions vs Computed property — What to use? | by Aaina jain | Swift India | Medium
うむむ、具体的にどう考えたらいいのか。
Apple 公式サンプルをさらう。
struct BackyardsSearchSuggestions: View {
@Query private var backyards: [Backyard]
var events: [BackyardVisitorEvent] {
Set(backyards.compactMap(\.currentVisitorEvent))
.sorted { ($0.backyard?.name ?? "") < ($1.backyard?.name ?? "") }
.sorted { ($0.bird?.speciesName ?? "") < ($1.bird?.speciesName ?? "") }
}
var body: some View {
ForEach(events) { event in
struct BirdFoodPickerSheet: View {
var backyard: Backyard
@Query(sort: [.init(\BirdFood.priority, order: .reverse), .init(\BirdFood.name, comparator: .localizedStandard)])
private var birdFood: [BirdFood]
@Environment(\.dismiss) private var dismiss
@State private var presentingBirdFoodShop = false
private let metrics = BirdFoodStoreMetrics.birdFoodStore
var premiumFood: [BirdFood] {
birdFood.filter(\.isPremium)
}
var otherFood: [BirdFood] {
birdFood.filter { !$0.isPremium }
}
struct BirdsSearchSuggestions: View {
@Query private var birds: [Bird]
var speciesNames: [String] {
Set(birds.map(\.speciesName)).sorted()
}
var body: some View {
ForEach(speciesNames, id: \.self) { speciesName in
struct PlantsSearchSuggestions: View {
@Query private var plants: [Plant]
var speciesNames: [String] {
Set(plants.map(\.speciesName)).sorted()
}
var body: some View {
ForEach(speciesNames, id: \.self) { speciesName in
struct BackyardBirdsPassShop: View {
@Environment(\.dismiss) private var dismiss
@Environment(\.passIDs.group) private var passGroupID
@Environment(\.passStatus) private var passStatus
private var showPremiumUpgrade: Bool {
passStatus == .individual || passStatus == .family
}
struct BackyardsSearchSuggestions: View {
@Query private var backyards: [Backyard]
var events: [BackyardVisitorEvent] {
Set(backyards.compactMap(\.currentVisitorEvent))
.sorted { ($0.backyard?.name ?? "") < ($1.backyard?.name ?? "") }
.sorted { ($0.bird?.speciesName ?? "") < ($1.bird?.speciesName ?? "") }
}
var body: some View {
ForEach(events) { event in
View 内の利用状況だけをみると、
ほぼ @Query の加工にしか使ってない。
逆に言えば
@Query の加工には Computed Property が使える。
ということは言えそう。
ちなみに、View 内に func はほとんど見当たらない。