質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

904閲覧

所有している配列を表示したい

nyamagoyaki

総合スコア4

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/04/12 10:52

編集2021/04/13 12:30

実現したいこと

Realmで保存したデータを表示したいのですが、最後の要素だけ表示されてしまいます。
表示したいのはTweetクラスのプロパティtweetsに保存してあるreplyTweetであるList型です。tweesの保存してあるreplyTweetだけを表示したいのですが、List型なので以下のように配列のメソッドを使わないとアクセスできず、実行はできるのですが、最後の要素だけ表示されてしまいました。
currentUserはシングルトンパターンで、これに各ユーザーのデータを保存しています。

やってみたこと

以下のように、コメントアウトしたところをそれぞれ試してみたのですが、tweetsはすべて表示できますが、replyTweetだけ最後の要素のみとなってしまいます。
調べて見ると、forEachで上書きしてしまうことが分かりました。
どうか理解できる方、他にいい配列のメソッドや方法を教えていただきたいです。

tweets = Array(currentUser.user.tweets) tweets.forEach { tweet in currentUser.user.replyTweet = tweet.replyTweet } // tweets.enumerated().forEach({ (index,tweet) in // replyTweet = Array(currentUser.user.tweets[index].replyTweet) // print("replyTweet: (currentUser.user.tweets[index].replyTweet)") // }) // 結果 currentReply: [ReplyTweet { replyTweetId = 0; replyCaption = Nani; replyTimeStamp = 2021-04-12 09:20:55 +0000; replyRetweetCount = 0; likes = 0; didLike = 0; replyingTo = (null); imageURL = (null); imageURLs = List<CellImageURL> <0x600001b513b0> ( ); }, ReplyTweet { replyTweetId = 1; replyCaption = So; replyTimeStamp = 2021-04-12 09:21:07 +0000; replyRetweetCount = 0; likes = 0; didLike = 0; replyingTo = (null); imageURL = (null); imageURLs = List<CellImageURL> <0x600001b51440> ( ); }] // ここで上書きしている currentReply: [ReplyTweet { replyTweetId = 3; replyCaption = Fine; replyTimeStamp = 2021-04-12 09:21:40 +0000; replyRetweetCount = 0; likes = 0; didLike = 0; replyingTo = (null); imageURL = (null); imageURLs = List<CellImageURL> <0x600001b518c0> ( ); }]

カレントユーザー

class CurrentUser { static let shared: CurrentUser = .init() private init() {} private(set) var user: User = .init() func setUser(_ user: User) { self.user = user } }

Realmデータ

class User: Object { @objc dynamic var id: Int = 0 var tweets = List<Tweet>() override static func primaryKey() -> String? { return "id" } } class Tweet: Object { @objc dynamic var tweetId: Int = 0 let users = LinkingObjects(fromType: User.self, property: "tweets") var replyTweet = List<ReplyTweet>() override static func primaryKey() -> String? { return "tweetId" } } class ReplyTweet: Object { @objc dynamic var replyTweetId: Int = 0 let replyTweets = LinkingObjects(fromType: Tweet.self, property: "replyTweet") override static func primaryKey() -> String? { return "replyTweetId" } }

VC

class ProfileController: UICollectionViewController { let currentUser = CurrentUser.shared private let reuseIdentifier = "TweetCell" private var user: Results<User>! private var tweets: [Tweet] = [Tweet]() private var replyTweet = [ReplyTweet]() override func viewDidLoad() { super.viewDidLoad() tweets = Array(currentUser.user.tweets) } private var selectedFilter: ProfileFilterOptions = .tweets { didSet { collectionView.reloadData() } } override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { switch self.selectedFilter { case .tweets: return tweets.count case .replies: return replyTweet.count case .likes: return resultTweetLike.count + resultReplyLike.count } } override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! TweetCell cell.delegate = self switch self.selectedFilter { case .tweets: let tweetIndex = tweets[indexPath.row] cell.tweets = tweetIndex case .replies: let replyTweetIndex = replyTweet[indexPath.row] // 最後の要素のみ cell.replyTweets = replyTweetIndex return cell } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問