Аргумент, переданный для вызова, который не принимает аргументов с данными (contentOf :) - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь закодировать и декодировать json данные, которые он swift 4.2, но работаю с этой ошибкой Argument passed to call that takes no arguments Я не уверен, что делаю не так, попытался найти ошибку в стеке на предмет ошибки, но безуспешно. Вот мой код Аргумент передан для вызова, который не принимает аргументов

import Foundation

struct Section : Codable {
    var title : String
    var caption : String
    var body : String
    var imageName : String
    var publishDate : Date

    enum CodingKeys : String, CodingKey {
        case title, caption, body
        case imageName = "image"
        case publishDate = "publish_date"
    }
}

class ContentAPI {

    static var shared : ContentAPI = ContentAPI()


    lazy var sections : Array<Section> = {
        let url = Bundle.main.url(forResource: "myFile", withExtension: "json")!
        let data = try! Data(contentsOf: url)
        let decoder = JSONDecoder()
        decoder.dateDecodingStrategy = .secondsSince1970
        return try! decoder.decode(Array<Section>.self, from: data)
    }()
}

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Ваша основная проблема в том, что вы забыли завершающий }(), иначе код должен работать безопасно и не вызовет сбой, если файл существует или нет

lazy var sections : Array<Section> = {

    guard let path = Bundle.main.path(forResource: "myFile", ofType: "json") else { return [] }
    let url = URL(fileURLWithPath: path)

    guard let data = try? Data(contentsOf: url) else { return [] }

    do {
        let decoder = JSONDecoder()
        decoder.dateDecodingStrategy = .secondsSince1970
        let sections = try decoder.decode(Array<Section>.self, from: data)
        return sections
    } catch {
        print(error)
    }
    return []
}()
0 голосов
/ 20 ноября 2018

В основном код правильный.Существует ли расширение Data с дополнительными инициализаторами?

Поскольку файл находится в комплекте и не может быть изменен во время выполнения, вы можете принудительно развернуть все значения.Код не должен падать.

lazy var sections : Array<Section> = {
    let url = Bundle.main.url(forResource: "myFile", withExtension: "json")!
    let data = try! Data(contentsOf: url)
    let decoder = JSONDecoder()
    decoder.dateDecodingStrategy = .secondsSince1970
    return try! decoder.decode(Array<Section>.self, from: data)
}() 
...