Быстрая ошибка: `Элемент экземпляра * нельзя использовать для типа - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь прочитать данные из файла 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

1 Ответ

0 голосов
/ 03 июня 2019

вы не можете получить доступ к члену класса, который не является членом типа, для этого вам нужно создать объект (экземпляр) вашего класса, как я создал ниже,

class ViewController: UIViewController {

    let instance = ModelA()
    let data = instance.readFromJSONFile() 

    override func viewDidLoad() {
        super.viewDidLoad()
        print(data.name)
    }

}
...