SwiftでDictionaryにJSONデータを追加(append)する方法について、ご質問させてください。
お力添えいただけますと幸いです。よろしくお願いいたします。
サーバーからJSONデータ(自分に来た友達申請情報)を取得し、辞書に格納したあと、
xx秒おきにサーバーを監視し(サーバー監視のロジックは省略させてください)、
もし新たに友達申請が増えていた場合に、その更新分を取得し、辞書に追加したいと考えています。
JSONのデータはこちらです:
//JSONデータ { "number_of_friends_requests": 2, "friends_requests": [ { "users_id": 1, "users_name": "string", "users_thumbnail_image_url": "string" }, { "users_id": 2, "users_name": "string", "users_thumbnail_image_url": "string" } ] }
ViewModel内で、サーバー通信および辞書への格納をしています。
SwiftUI
1 2@Published var friendRequestUsers: FriendsRequestsList? 3 4class SearchFriendViewModel: ObservableObject { 5//中略 6func receiveFriendRequest (skip: Int?, limit: Int?) { 7 8URLSession.shared.dataTask(with: request) { (data, response, error) in 9 10do { 11self.friendRequestUsers = try JSONDecoder().decode(FriendsRequestsList.self, from: data) 12 print("friend requests are (self.friendRequestUsers)") 13//print結果(これは上手く行きます):friend requests are Optional(FriendQA_SwiftUI.FriendsRequestsList(id: 0, numberOfFriendsRequests: 2, friendsRequests: [FriendQA_SwiftUI.FriendsRequests(id: 69, usersName: "Sfaweaw", usersThumbnailImageUrl: "xxx"),FriendQA_SwiftUI.FriendsRequests(id: 68, usersName: "Waiwai", usersThumbnailImageUrl: "xxx")])) 14 15//中略 16 17//ここで更新分の追加を試みましたが、エラーになりビルドができませんでした。 18let newFriendRequest = try JSONDecoder().decode(FriendsRequestsList.self, from: data) 19self.friendRequestUsers.append(newFriendRequest) 20//Value of type 'FriendsRequestsList?' has no member 'append' 21self.friendRequestUsers.addObject(newFriendRequest) 22//Value of type 'FriendsRequestsList?' has no member 'addObject' 23self.friendRequestUsers["xxx"] = newFriendRequest //xxxのkeyに何を書けばいいかわからず 24 25} catch { 26} 27} 28 29} 30
Modelはこちら:
SwiftUI
1 2 struct FriendsRequestsList: Identifiable, Decodable { 3 4 let id: Int 5 let numberOfFriendsRequests: Int 6 let friendsRequests: [FriendsRequests] 7 8 9 enum CodingKeys: String, CodingKey { 10 case id = "users_id" 11 case numberOfFriendsRequests = "number_of_friends_requests" 12 case friendsRequests = "friends_requests" 13 } 14 15 init(from decoder: Decoder) throws { 16 17 let container = try decoder.container(keyedBy: CodingKeys.self) 18 19 self.id = try container.decodeIfPresent(Int.self, forKey: .id) ?? 0 20 self.numberOfFriendsRequests = try container.decodeIfPresent(Int.self, forKey: .numberOfFriendsRequests) ?? 0 21 self.friendsRequests = try container.decodeIfPresent([FriendsRequests].self, forKey: .friendsRequests) ?? [FriendsRequests]() 22 23 } 24 25 } 26 27 struct FriendsRequests: Identifiable, Decodable { 28 let id: Int 29 let usersName: String 30 let usersThumbnailImageUrl: String 31 32 33 enum CodingKeys: String, CodingKey { 34 case id = "users_id" 35 case usersName = "users_name" 36 case usersThumbnailImageUrl = "users_thumbnail_image_url" 37 } 38 39 init(from decoder: Decoder) throws { 40 41 let container = try decoder.container(keyedBy: CodingKeys.self) 42 43 self.id = try container.decodeIfPresent(Int.self, forKey: .id) ?? 0 44 self.usersName = try container.decodeIfPresent(String.self, forKey: .usersName) ?? "" 45 self.usersThumbnailImageUrl = try container.decodeIfPresent(String.self, forKey: .usersThumbnailImageUrl) ?? "" 46 47 } 48 49 50 }
お力添えいただけますと幸いです。よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー