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

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

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

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

Swift

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

Q&A

解決済

1回答

3617閲覧

ソートする際にExpression is not assignable: function call returns immutable value

nyamagoyaki

総合スコア4

Realm

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

Swift

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

0グッド

0クリップ

投稿2021/04/08 13:58

編集2021/04/09 02:09

エラー内容

SwiftでRealmのデータをソートしたいところなのですが、
Expression is not assignable: function call returns immutable value
と出てしまいます。
まず最初に

tweets.replyTweet = tweets.replyTweet.sorted(by: { $0.replyTimeStamp > $1.replyTimeStamp })

とするとCannot assign value of type '[ReplyTweet]' to type 'List<ReplyTweet>'
と出たので以下のようにList型をArrayに変えてみたり、いろいろ試してみました。

Array(tweets.replyTweet) = tweets.replyTweet.sorted(by: { $0.replyTimeStamp > $1.replyTimeStamp }) // Result of call to 'sorted(by:)' is unused tweets.replyTweet.sorted(by: { $0.replyTimeStamp > $1.replyTimeStamp }) let reply = tweets.replyTweet.sorted(by: { $0.replyTimeStamp > $1.replyTimeStamp }) // Expression is not assignable: function call returns immutable value Array(tweets.replyTweet) = reply // Cannot assign value of type '[ReplyTweet]' to type 'List<ReplyTweet>' tweets.replyTweet = reply

Expression is not assignable: function call returns immutable value
と出てきてしまい、エラーが出てきてしまいます。これはどういうことなのでしょうか?
__replyTweet__はList型で、配列にしろとなったので配列にしたら上記のエラーになってしまいました。
イメージ説明

また、別のクラスでTweetクラスを配列にした次の例は実行でき、ソートもできました。

private var tweets: [Tweet] = [Tweet]() self.tweets = tweets.sorted(by: { $0.timestamp > $1.timestamp })

同じ配列なのに、どのような違いが生じるのか理解できません。
どうか理解できる方にどう書き換えたらいいのかご教授してくださると助かります。

コード

class Tweet: Object { @objc dynamic var tweetId: Int = 0 @objc dynamic var caption: String = "" @objc dynamic var timestamp: Date = Date() 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 @objc dynamic var replyCaption: String = "" @objc dynamic var replyTimeStamp: Date = Date() let replyTweets = LinkingObjects(fromType: Tweet.self, property: "replyTweet") override static func primaryKey() -> String? { return "replyTweetId" } } private var tweets: Tweet func handleRetweetTapped(_ cell: TweetCell) { let indexPath = collectionView.indexPath(for: cell) let tweetIndex = tweets.replyTweet[indexPath!.row] let formatter: DateFormatter = DateFormatter() formatter.dateFormat = "yyyy/MM/dd ・h:mm a " let formatString = formatter.string(from: Date()) try! realm.write { tweetIndex.replyTimeStamp = formatter.date(from: formatString)! } // tweets.replyTweet = tweets.replyTweet.sorted(by: { $0.replyTimeStamp > $1.replyTimeStamp }) Array(tweets.replyTweet) = tweets.replyTweet.sorted(by: { $0.replyTimeStamp > $1.replyTimeStamp }) // Expression is not assignable: function call returns immutable value collectionView.reloadData() }

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

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

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

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

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

guest

回答1

0

ベストアンサー

同じ配列なのに、どのような違いが生じるのか理解できません。

同じ配列ではありません。

ArrayはSwiftのStandard Libraryに含まれる型ですが、Listはそうではありません。
ListはRealmの独自の型です。

ArrayListは違うものなので、同じように使えません。

RealmのListをどう使うかは、Realmのドキュメントを参照するしかないと思います。
これかな。
https://docs.mongodb.com/realm-sdks/swift/latest/Classes/List.html

List.sorted(by:)の戻り値はResultsらしいです。

私はRealmを知らないので直接解を出せず申し訳ありませんが、この辺りを参考に、Result<>からList<>を作れば代入できるのではないかと思います。
https://stackoverflow.com/questions/33363972/realm-resultst-als-listt

蛇足ですが、
self.tweets = tweets.sorted(by: { $0.timestamp > $1.timestamp })

tweets.sort(by: { $0.timestamp > $1.timestamp })
とする方がよいように思います。

投稿2021/04/09 16:24

eytyet

総合スコア803

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問