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

Ios 无法访问Swift中的可编码结构值,ios,swift,struct,codable,Ios,Swift,Struct,Codable,我从服务中获取用户的数据作为json,并将其解码为可编码的用户结构。我可以在获取响应的地方访问该属性,但我想在其他地方访问该User struct属性,比如在另一个类、函数等中 我是新手,我认为理想的方法是在获取数据时,将数据存储到核心数据或用户默认值中,然后相应地更新我的视图 请建议最佳和适当的方法,或者是否有直接访问可编码结构值的方法 这是我的可编码结构- 在某些函数中访问struct的错误方法是- UserInfo.CodingKeys.name.rawValue //Output is

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

我是新手,我认为理想的方法是在获取数据时,将数据存储到核心数据或用户默认值中,然后相应地更新我的视图

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

这是我的可编码结构-

在某些函数中访问struct的错误方法是-

UserInfo.CodingKeys.name.rawValue
//Output is the key string - '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
    }
}
创建另一个包含用户引用的类

然后,您可以按以下方式访问任何用户数据:

AppGlobalManager.sharedInstance.currentUser.name
我想静电能帮你

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 _ {
   }
  }
}
在不使用coreData或UserDefaults的情况下,在任何地方都可以这样使用


你不应该指责它使用类似于某个referencetouser.name的东西吗?但我想在其他地方访问该User struct属性,比如在另一个类、函数等中,因此对User的引用需要对这些类/函数可用。您需要将其传递给这些元素,或者以某种方式使其全局可用。。。不过,我想看看你是如何通过传递引用来做到这一点的。您可能会考虑领域,但这可能是为了实现您想要实现的共享实例的重量级。因为它可以用refe直接访问。@PrashantTukadiya使用singleton,您不需要传递引用,作为它的静态对象,您可以在应用程序中的任何位置访问它。是的,但您应该使用共享实例创建单独的类,该类具有用户ref对象。这样,您就不需要在类内创建可编码的类共享实例了,希望您能得到我的point@PrashantTukadiya这完全是个人的选择,还取决于应用程序使用的架构。我喜欢保持我的模型类最少,所以我只为我的解析器创建纯模型类,为我的视图类创建协议。你是对的,这是个人的选择。但对我来说,在codable类中拥有共享实例似乎是一种不好的做法,在将来的更新或项目规模增加时可能很难管理。但如果我们能把所有的东西都放在一个容易管理的地方。
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 _ {
   }
  }
}
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)
  }
 }
}