質問編集履歴

2

誤字脱字が反映されていなかったため再度修正

2021/05/20 06:46

投稿

massanmesu
massanmesu

スコア36

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,6 @@
1
1
  ItemというモデルクラスがRealmに格納されています。
2
2
 
3
- 今日の日付を文字列に変換したプロパティ`date`があるのですが、アプリ起動時にこの値が起動した日から一年前以上であるデータを取得するという関数を作りたいです。
3
+ 今日の日付を文字列に変換したプロパティ`date`があるのですが、アプリ起動時に一年前に保存したデータを取得するという関数を作りたいです。
4
4
 
5
5
  ```swift
6
6
 
@@ -76,7 +76,7 @@
76
76
 
77
77
 
78
78
 
79
- var itemList: Results<Item>!
79
+ var itemList: Results<Item>!
80
80
 
81
81
  var realm = try! Realm()
82
82
 
@@ -94,48 +94,46 @@
94
94
 
95
95
  confirmEvaluationTargetProduct()
96
96
 
97
+ }
98
+
99
+
100
+
101
+ private func confirmEvaluationTargetProduct() {
102
+
103
+ let items = realm.objects(Item.self)
104
+
105
+ let results = select(items: items)
106
+
97
107
 
98
108
 
109
+ if results.count > 0 {
110
+
111
+ self.itemList = results
112
+
113
+ print("一年以上前のデータがありました:(results.count)個")
114
+
115
+ } else {
116
+
117
+ self.itemList = items
118
+
119
+ print("一年以上前のデータはありません")
120
+
99
- }
121
+ }
122
+
100
-
123
+ }
124
+
125
+
126
+
101
-
127
+ private func select(items: Results<Item>) -> Results<Item> {
128
+
102
-
129
+ let dateBefore1Year = Calendar.current.date(byAdding: .year, value: -1, to: Date())!
130
+
131
+ let formattedDateBefore1Year = Item.convertDateTypeToString(convertDate: dateBefore1Year)
132
+
103
- private func confirmEvaluationTargetProduct() {
133
+ print("一年前の日付: (formattedDateBefore1Year)")
104
-
105
- let items = realm.objects(Item.self)
106
-
107
- let results = select(items: items)
108
134
 
109
135
 
110
136
 
111
- if results.count > 0 {
112
-
113
- self.itemList = results
114
-
115
- print("一年以上前のデータがありました:(results.count)個")
116
-
117
- } else {
118
-
119
- self.itemList = items
120
-
121
- print("一年以上前のデータはありません")
122
-
123
- }
124
-
125
- }
126
-
127
-
128
-
129
- private func select(items: Results<Item>) -> Results<Item> {
130
-
131
- let dateBefore1Year = Calendar.current.date(byAdding: .year, value: -1, to: Date())!
132
-
133
- let formattedDateBefore1Year = Item.convertDateTypeToString(convertDate: dateBefore1Year)
134
-
135
- print("一年前の日付: (formattedDateBefore1Year)")
136
-
137
-
138
-
139
137
  let result = items.filter("date = %@", formattedDateBefore1Year)
140
138
 
141
139
  return result

1

誤字脱字の修正

2021/05/20 06:46

投稿

massanmesu
massanmesu

スコア36

test CHANGED
@@ -1 +1 @@
1
- Realmで保存したデータを検索する関数filter()について
1
+ Realmで保存したデータを検索する関数filter()に渡す式に使う比較演算子
test CHANGED
@@ -60,4 +60,162 @@
60
60
 
61
61
  ```
62
62
 
63
+
64
+
65
+ **一年以上前のデータを取得する関数**(質問に関連しないコードは割愛)
66
+
67
+ ```
68
+
69
+ import UIKit
70
+
71
+ import RealmSwift
72
+
73
+
74
+
75
+ class ItemTableViewController: UIViewController {
76
+
77
+
78
+
79
+ var itemList: Results<Item>!
80
+
81
+ var realm = try! Realm()
82
+
83
+
84
+
85
+
86
+
87
+ override func viewDidLoad() {
88
+
89
+ super.viewDidLoad()
90
+
91
+
92
+
93
+ // 評価対象商品があるか確認
94
+
95
+ confirmEvaluationTargetProduct()
96
+
97
+
98
+
99
+ }
100
+
101
+
102
+
103
+ private func confirmEvaluationTargetProduct() {
104
+
105
+ let items = realm.objects(Item.self)
106
+
107
+ let results = select(items: items)
108
+
109
+
110
+
111
+ if results.count > 0 {
112
+
113
+ self.itemList = results
114
+
115
+ print("一年以上前のデータがありました:(results.count)個")
116
+
63
- アプリ起動時に
117
+ } else {
118
+
119
+ self.itemList = items
120
+
121
+ print("一年以上前のデータはありません")
122
+
123
+ }
124
+
125
+ }
126
+
127
+
128
+
129
+ private func select(items: Results<Item>) -> Results<Item> {
130
+
131
+ let dateBefore1Year = Calendar.current.date(byAdding: .year, value: -1, to: Date())!
132
+
133
+ let formattedDateBefore1Year = Item.convertDateTypeToString(convertDate: dateBefore1Year)
134
+
135
+ print("一年前の日付: (formattedDateBefore1Year)")
136
+
137
+
138
+
139
+ let result = items.filter("date = %@", formattedDateBefore1Year)
140
+
141
+ return result
142
+
143
+ }
144
+
145
+ }
146
+
147
+ ```
148
+
149
+
150
+
151
+
152
+
153
+ ```
154
+
155
+ let result = items.filter("date = %@", formattedDateBefore1Year)
156
+
157
+ ```
158
+
159
+ イコールにすると「ちょうど一年前データの取得」になり、これはうまく動作しました。
160
+
161
+ 「一年以上前のデータの取得」の処理に変えようと以下のコードに変更したところエラーが発生。
162
+
163
+ ```
164
+
165
+ let result = items.filter("date <= %@", formattedDateBefore1Year)
166
+
167
+ ```
168
+
169
+ `Thread 1: "Operator '<=' not supported for type 'string'"`
170
+
171
+
172
+
173
+ 文字列の日付は比較できない仕様なのかと思ったのですが、以下のサンプルコードはうまく動作したので原因が特定できません。
174
+
175
+ ```Sample
176
+
177
+ import UIKit
178
+
179
+
180
+
181
+ func dateFormat(date: Date) -> String {
182
+
183
+ let formatter = DateFormatter()
184
+
185
+ formatter.dateStyle = .long
186
+
187
+ formatter.timeStyle = .none
188
+
189
+ formatter.locale = Locale(identifier: "ja_JP")
190
+
191
+ return formatter.string(from: date)
192
+
193
+ }
194
+
195
+
196
+
197
+ let today = Date()
198
+
199
+ let dateBefore1Year = Calendar.current.date(byAdding: .year, value: -1, to: today)!
200
+
201
+
202
+
203
+ let formattedToday = dateFormat(date: today) // "2021年5月20日"
204
+
205
+ let formattedDB1Y = dateFormat(date: dateBefore1Year) // "2020年5月20日"
206
+
207
+
208
+
209
+ print(formattedDB1Y <= formattedToday) // true
210
+
211
+
212
+
213
+ ```
214
+
215
+
216
+
217
+ ちなみに文字列に変換してるのは、時間で比較してほしくないからです。
218
+
219
+
220
+
221
+ ご教授よろしくお願いします。