前提
SwiftUIで食材を賞味期限順に並び替えるシステムを作っています。
配列に要素を追加しようとしたところ以下のエラーメッセージが発生しました。
実現したいこと
- 日付でソートした配列の順序変更を、その他の配列(nameとdate)にも適用させる
発生している問題・エラーメッセージ
Cannot use mutating member on immutable value: 'self' is immutable
該当のソースコード
Swift
1func dateSort()-> Int{ 2 for dataForConversion in date { 3 let formattedDate = dateFromString(string: dataForConversion, format: "y/M/d") 4 formattedDateArray.append(formattedDate)//ここにエラーが出ます 5 } 6 let dateSorted = formattedDateArray.enumerated().sorted { $0.element < $1.element } 7 for indexPathRow in 0..<formattedDateArray.count { 8 let originalIndex = dateSorted[indexPathRow] 9 dateArray.append(date[originalIndex.offset])//ここにエラーが出ます 10 nameArray.append(name[originalIndex.offset])//ここにエラーが出ます 11 } 12 return nameArray.count 13 }
全体のコード
Swift
1import SwiftUI 2struct ContentView: View { 3 var name:[String] = ["玉ねぎ", "じゃがいも", "にんじん", "牛肉", "きのこ"] 4 var date:[String] = ["2022/7/25","2022/7/24","2022/7/26","2022/7/27","2022/7//28"] 5 var formattedDateArray:[Date] = [] 6 var dateArray:[String] = [] 7 var nameArray: [String] = [] 8 func dateFromString(string: String, format: String) -> Date { 9 let formatter: DateFormatter = DateFormatter() 10 formatter.calendar = Calendar(identifier: .gregorian) 11 formatter.dateFormat = format 12 return formatter.date(from: string)! 13 } 14 func dateSort()-> Int{ 15 for dataForConversion in date { 16 let formattedDate = dateFromString(string: dataForConversion, format: "y/M/d") 17 formattedDateArray.append(formattedDate) 18 } 19 let dateSorted = formattedDateArray.enumerated().sorted { $0.element < $1.element } 20 for indexPathRow in 0..<formattedDateArray.count { 21 let originalIndex = dateSorted[indexPathRow] 22 dateArray.append(date[originalIndex.offset]) 23 nameArray.append(name[originalIndex.offset]) 24 } 25 return nameArray.count 26 } 27 @State private var searchText = "" 28 var body: some View { 29 VStack { 30 NavigationView { 31 List { 32 ForEach(searchResults, id: \.self) { name in 33 Text(name) 34 } 35 } 36 .searchable(text: $searchText, prompt: "食材の検索") 37 .keyboardType(.default) 38 .navigationTitle("全ての食材") 39 } 40 List(0 ..< dateSort(), id:\.self) { item in 41 Text(nameArray[item]) 42 } 43 } 44 } 45 var searchResults: [String] { 46 if searchText.isEmpty { 47 return name 48 } else { 49 return name.filter{ $0.contains(searchText) } 50 } 51 } 52}
質問
エラーの原因はなんでしょうか。
もしよろしければ、mutatingとはなんなのかと解決方法も教えてほしいです。
試したこと
XCodeの指示に従ってmutating funcにしてみましたが、
Swift
1mutating func dateSort()-> Int{ 2 for dataForConversion in date { 3 let formattedDate = dateFromString(string: dataForConversion, format: "y/M/d") 4 formattedDateArray.append(formattedDate) 5 } 6 let dateSorted = formattedDateArray.enumerated().sorted { $0.element < $1.element } 7 for indexPathRow in 0..<formattedDateArray.count { 8 let originalIndex = dateSorted[indexPathRow] 9 dateArray.append(date[originalIndex.offset]) 10 nameArray.append(name[originalIndex.offset]) 11 } 12 return nameArray.count 13 }
こちらでエラーが発生しました。
Cannot use mutating member on immutable value: 'self' is immutableとでました。
Swift
1List(0 ..< dateSort(), id:\.self) { item in 2 Text(nameArray[item]) 3 }

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/07/23 16:18