无法访问 Swift 中的可编码结构值



我正在从服务中获取用户数据作为json并解码为可编码的用户结构。我可以访问我获取响应的属性,但我想在其他地方访问该 User 结构属性,比如说在另一个类、函数等中。

我是新手,我认为理想的方法是"在获取时,将该数据存储到Core DataUser Defaults中,然后相应地更新我的观点。

请建议什么是最佳和适当的方法,或者是否有任何方法可以直接访问可编码的结构值。

这是我的可编码结构 -

struct User: Codable {
let name : String?
enum CodingKeys: String, CodingKey {
case name = "Name"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
name = try values.decodeIfPresent(String.self, forKey: .name)
}
}

我在某些函数中访问结构的错误方式是 -

UserInfo.CodingKeys.name.rawValue
//Output is the key string - 'Name'

我认为static可以帮助你

struct User: Codable {
let name : String?
private enum CodingKeys: String, CodingKey {
case name = "Name"
}
}

假设在此处获取数据

class FetchingClass{
static var user: User?
func fetchData(){
//After Url request success
do {
//assign directly to static varibale user
FetchingClass.user = try JSONDecoder().decode(User.self, from: data)
} catch _ {
}
}
}

随时随地使用,无需使用coreDataUserDefaults

class AnotherClass{
func anotherClassFunc(){
//use if let or guard let
if let user = FetchingClass.user{
print(user.name)
}
//or
if let FetchingClass.user != nil {
print(FetchingClass.name)
}
}
}

您可以尝试使用单例引用

struct User: Codable {
let name : String?
enum CodingKeys: String, CodingKey {
case name = "Name"
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
name = try values.decodeIfPresent(String.self, forKey: .name)
User.shared = self
}
}

创建另一个包含User引用的类

final class AppGlobalManager  {
static let sharedInstance = AppGlobalManager()
var currentUser: User? // Initialise it when user logged in   
private init()
}

然后,您可以访问任何用户数据

AppGlobalManager.sharedInstance.currentUser.name

最新更新