管理JSON文件-结构还是类?[关闭]

vs91vp4v  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(162)

已关闭,此问题为opinion-based。目前不接受答复。
**想改善这个问题吗?**更新问题,以便editing this post可以用事实和引用来回答。

4天前关闭。
Improve this question
我想问一个关于我的疑问的问题。
我目前正在使用两个数据模型结构和一个用于数据管理的FriendsManager类来实现对JSON文件进行解码的代码
在您看来,这是一个好的方法吗?或者我应该使用structs而不是使用class
我是一个解码JSON文件的新手,我想确保我的代码是正确的

private let JSONFriendFileName = "Friends"

class FriendsManager: ObservableObject {

    var friendsList: [FriendsList] = []
    
    init() {
        let decoder = JSONDecoder()
        decoder.keyDecodingStrategy = .convertFromSnakeCase
        decode(fileName: JSONFriendFileName, decoder: decoder)
    }
    
     func decode(fileName: String, decoder: JSONDecoder) {
        
        guard let url = Bundle.main.url(forResource: JSONFriendFileName, withExtension: "json") else {
            print("Non esiste alcun file denominato \(JSONFriendFileName + ".json") in questo progetto")
            return
        }

        do {
            let data = try Data(contentsOf: url)
            let items = try decoder.decode(Friends.self, from: data)

            friendsList = items.friendsList

        } catch {
            print(error.localizedDescription)
        }
    }
}

struct Friends: Codable {
    var friendsList: [FriendsList]
}

struct FriendsList: Codable, Identifiable {
    let name: String
    let timestamp: Int?
    let contact_info: String?
    
    let id = UUID()
    
    enum CodingKeys: String, CodingKey {
        case name, timestamp, contact_info
    }
}

数据使用

import SwiftUI

struct FriendsView: View {
    
    @StateObject private var friendsManager = FriendsManager()
    
    var body: some View {
        NavigationView {
            List {
                ForEach(friendsManager.friendsList) { friends in
                    Text(friends.name)
                }
            }
            .navigationTitle("Friends")
        }
    }
}
92dk7w1h

92dk7w1h1#

答案很复杂,因为这取决于您计划如何使用FriendsFriendsList对象。struct是不可变的,class是可变的。阅读更多关于here的差异。
我会说,如果你不打算在应用程序中稍后修改FriendsList-使用struct。如果您计划稍后在应用程序中修改它,则有几个选项:

  • 使用struct并使用相同的数据创建另一个对象,稍后将修改这些对象。
  • 使用class并稍后修改它。

这两种情况都带来了额外的复杂性--你必须将更改存储在某个地方,这就导致了在哪里以及如何存储的问题(数据库、后端等)。
同样在你的地方,我会将FriendsList结构重命名为Friend,因为它表示单个对象(朋友)而不是列表。否则,这是一个有点令人困惑的名字。

struct Friends: Codable {
    var friendsList: [Friend]
}

struct Friend: Codable, Identifiable {
...
}

相关问题