Я пытаюсь прочитать данные из файла json из комплекта и для этого я создал protocol ReadableJSONFile
, и в нем есть fileName
для хранения имени файла json и readFromJSONFile()
для декодирования файла
public protocol ReadableJSONFile {
/// The name of your json file in the bundle
var fileName: String { get }
func readFromJSONFile() -> Self
}
И
public extension ReadableJSONFile where Self: Codable {
var fileName: String {
return "\(String(describing: Self.self)).json"
}
func readFromJSONFile() -> Self {
guard let url = Bundle.main.url(forResource: fileName, withExtension: nil) else {
fatalError("Failed to locate \(fileName) in app bundle.")
}
guard let data = try? Data(contentsOf: url) else {
fatalError("Failed to load \(fileName) in app bundle.")
}
let decoder = JSONDecoder()
guard let loaded = try? decoder.decode(Self.self, from: data) else {
fatalError("Failed to decode \(fileName) from app bundle.")
}
return loaded
}
}
Я написал этот простой файл json и назову его ModelA.json
{
"color": "yellow",
"name": "Mike"
}
А затем создал эту модель для представления ModelA.json
файла
struct ModelA: Codable, ReadableJSONFile {
let color: String
let name: String
}
И внутри моего контроллера просмотра у меня есть эти строки кода
class ViewController: UIViewController {
let data = ModelA.readFromJSONFile() // Here an error saying "Instance member 'readFromJSONFile' cannot be used on type 'ModelA'; did you mean to use a value of this type instead?"
override func viewDidLoad() {
super.viewDidLoad()
print(data.name)
}
}
Когда я делаю fileName
и readFromJSONFile()
как static
, все работает, но когда я делаю это, я не могу переопределить fileName
внутри ModelA
, как подтверждено ReadableJSONFile