実現したいこと
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 } }
あなたの回答
tips
プレビュー