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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

解決済

関数の中で配列に要素を追加したいのですが、エラーが発生しました。

soarthesky
soarthesky

総合スコア3

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

1回答

0リアクション

0クリップ

212閲覧

投稿2022/07/23 14:06

前提

SwiftUIで食材を賞味期限順に並び替えるシステムを作っています。
配列に要素を追加しようとしたところ以下のエラーメッセージが発生しました。

実現したいこと

  • 日付でソートした配列の順序変更を、その他の配列(nameとdate)にも適用させる

発生している問題・エラーメッセージ

Cannot use mutating member on immutable value: 'self' is immutable

該当のソースコード

Swift

func dateSort()-> Int{ for dataForConversion in date { let formattedDate = dateFromString(string: dataForConversion, format: "y/M/d") formattedDateArray.append(formattedDate)//ここにエラーが出ます } let dateSorted = formattedDateArray.enumerated().sorted { $0.element < $1.element } for indexPathRow in 0..<formattedDateArray.count { let originalIndex = dateSorted[indexPathRow] dateArray.append(date[originalIndex.offset])//ここにエラーが出ます nameArray.append(name[originalIndex.offset])//ここにエラーが出ます } return nameArray.count }

全体のコード

Swift

import SwiftUI struct ContentView: View { var name:[String] = ["玉ねぎ", "じゃがいも", "にんじん", "牛肉", "きのこ"] var date:[String] = ["2022/7/25","2022/7/24","2022/7/26","2022/7/27","2022/7//28"] var formattedDateArray:[Date] = [] var dateArray:[String] = [] var nameArray: [String] = [] func dateFromString(string: String, format: String) -> Date { let formatter: DateFormatter = DateFormatter() formatter.calendar = Calendar(identifier: .gregorian) formatter.dateFormat = format return formatter.date(from: string)! } func dateSort()-> Int{ for dataForConversion in date { let formattedDate = dateFromString(string: dataForConversion, format: "y/M/d") formattedDateArray.append(formattedDate) } let dateSorted = formattedDateArray.enumerated().sorted { $0.element < $1.element } for indexPathRow in 0..<formattedDateArray.count { let originalIndex = dateSorted[indexPathRow] dateArray.append(date[originalIndex.offset]) nameArray.append(name[originalIndex.offset]) } return nameArray.count } @State private var searchText = "" var body: some View { VStack { NavigationView { List { ForEach(searchResults, id: \.self) { name in Text(name) } } .searchable(text: $searchText, prompt: "食材の検索") .keyboardType(.default) .navigationTitle("全ての食材") } List(0 ..< dateSort(), id:\.self) { item in Text(nameArray[item]) } } } var searchResults: [String] { if searchText.isEmpty { return name } else { return name.filter{ $0.contains(searchText) } } } }

質問

エラーの原因はなんでしょうか。
もしよろしければ、mutatingとはなんなのかと解決方法も教えてほしいです。

試したこと

XCodeの指示に従ってmutating funcにしてみましたが、

Swift

mutating func dateSort()-> Int{ for dataForConversion in date { let formattedDate = dateFromString(string: dataForConversion, format: "y/M/d") formattedDateArray.append(formattedDate) } let dateSorted = formattedDateArray.enumerated().sorted { $0.element < $1.element } for indexPathRow in 0..<formattedDateArray.count { let originalIndex = dateSorted[indexPathRow] dateArray.append(date[originalIndex.offset]) nameArray.append(name[originalIndex.offset]) } return nameArray.count }

こちらでエラーが発生しました。
Cannot use mutating member on immutable value: 'self' is immutableとでました。

Swift

List(0 ..< dateSort(), id:\.self) { item in Text(nameArray[item]) }

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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