Невозможно получить доступ к кодируемым значениям структуры в Swift - PullRequest
0 голосов
/ 05 октября 2018

Я получаю данные пользователя в виде json из сервиса и декодирую в структуру Codable User.Я могу получить доступ к этому свойству, где я получил ответ, но я хочу получить доступ к этому свойству структуры пользователя в другом месте, скажем, в другом классе, функции и т. Д.

Я новичок в этом, и ядумая, что идеальный подход заключается в том, чтобы «во время выборки сохранить эти данные в Core Data или User 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'

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Я думаю, 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 _ {
   }
  }
}

используйте, как вам угодно, без использования coreData или UserDefaults

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)
  }
 }
}
0 голосов
/ 05 октября 2018

Вы можете попробовать использовать одноэлементную ссылку

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
...