Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 复制时返回的无数据";“工作”;json数据到新的struc数组_Swift - Fatal编程技术网

Swift 复制时返回的无数据";“工作”;json数据到新的struc数组

Swift 复制时返回的无数据";“工作”;json数据到新的struc数组,swift,Swift,奇怪。我发誓这是有效的,但后来就停止了。。或请忽略i+i,我会清理这个 我不知道为什么,但是myrecords?[I]。title返回零。json.releases[i].date_adde运行良好,数据丰富。我可以“打印”它并得到结果。但当我把它复制到myrecords时,它返回零 我从JSON下载数据,效果很好。然后我尝试将数据复制到一个struc数组中,我可以在我的应用程序的其他部分找到它,现在我的myrecords数据是空的。我到底做错了什么 import Foundation var

奇怪。我发誓这是有效的,但后来就停止了。。或请忽略i+i,我会清理这个

我不知道为什么,但是
myrecords?[I]。title
返回零。
json.releases[i].date_adde
运行良好,数据丰富。我可以“打印”它并得到结果。但当我把它复制到myrecords时,它返回零

我从JSON下载数据,效果很好。然后我尝试将数据复制到一个struc数组中,我可以在我的应用程序的其他部分找到它,现在我的myrecords数据是空的。我到底做错了什么

import Foundation

var numberOfRecords : Int = 0


struct routine {
    var dateadded : String
    var title : String
    var artist : String
    var year : Int
    var recordlabel : String
}

var myrecords: [routine]?


//-------------------------------------------------------------

struct Response: Codable {
    var pagination: MyResult
    var releases: [MyReleases]
}

public struct MyResult: Codable {
    var page: Int
    var per_page: Int
    var items: Int
}

public struct MyReleases: Codable {
    var date_added: String
    var basic_information: BasicInformation
}

public struct BasicInformation: Codable {
    var title: String
    var year: Int
    var artists : [Artist]
    var labels: [Label]
}

public struct Artist: Codable {
    var name: String
}

public struct Label: Codable {
    var name: String
}

let url = "https://api.discogs.com/users/douglasbrown/collection/folders/0/releases?callback=&sort=added&sort_order=desc&per_page=1000"



public func getData(from url: String) {
    
    let task = URLSession.shared.dataTask(with: URL(string: url)!, completionHandler: { data, response, error in
        guard let data = data, error == nil else {
            print("something went wrong")
            return
        }
        //HAVE DATA
        var result: Response?
        do {
            result = try JSONDecoder().decode(Response.self, from: data)
        }
        catch {
            print("Converion Error:\(error.localizedDescription)")
        }
        
        guard let json = result else {
            return
        }
        

        numberOfRecords = json.pagination.items
    
        var i: Int
        i = -1
        for _ in json.releases {
            i = i + 1
    
            myrecords?[i].dateadded = json.releases[i].date_added
            myrecords?[i].title = json.releases[i].basic_information.title
            myrecords?[i].artist = json.releases[i].basic_information.artists[0].name
            myrecords?[i].year = json.releases[i].basic_information.year
            myrecords?[i].recordlabel = json.releases[i].basic_information.labels[0].name
            
            print(">>>>>>\(myrecords?[i].dateadded)")
        }
    })

    task.resume()
    
}

您尚未初始化
myrecords
数组

否则,您不能使用下标,如
myrecords[i]
当您不知道数组的容量时,它可能超出索引

首先,初始化数组

var myrecords: [routine]? = []
第二,将新元素附加到数组中,而不是使用下标

       for _ in json.releases {
        let newRecord = routine()

        newRecord.dateadded = json.releases[i].date_added
        newRecord.title = json.releases[i].basic_information.title
        newRecord.artist = json.releases[i].basic_information.artists[0].name
        newRecord.year = json.releases[i].basic_information.year
        newRecord.recordlabel = json.releases[i].basic_information.labels[0].name
        
        myrecords.append(newRecord)
    }
这就是答案。:)谢谢你们为我指明了正确的方向

struct Routine {
    var dateadded : String
    var title : String
    var artist : String
    var year : Int
    var recordlabel : String
}

var myRecords: [Routine] = []



  var i : Int
    i = -1
    for _ in json.releases {
        var newRecord = Routine.self(dateadded: "", title: "", artist: "", year: 0, recordlabel: "")
            i = i + 1
            newRecord.dateadded = json.releases[i].date_added
            newRecord.title = json.releases[i].basic_information.title
            newRecord.artist = json.releases[i].basic_information.artists[0].name
            newRecord.year = json.releases[i].basic_information.year
            newRecord.recordlabel = json.releases[i].basic_information.labels[0].name
                
            myRecords.append(newRecord)
       }
    print(">>>>\(myRecords[0].dateadded)")

我也会清理坏代码,但它可以工作,这很好!:)

你从来没有初始化过myrecords,所以它是nil。继我之前的评论之后,为什么这个属性被声明为可选的?这是一个设计解决方案还是一个坏习惯,因为如果它没有被声明为可选的话,你会得到一个帮助你解决这个问题的错误。如果它是可选的,那么在循环之前的getData中初始化它,
myrecords=[]
,否则在声明它时初始化它,
var myrecords=[routine]()
,并尝试遵循类型和变量的swift命名约定,应该是
Routine
myRecords
谢谢@JoakimDanielson。是的,坏习惯或者更像,我正在学习:(我真的很感谢你!我按照你的建议做了,现在我得到了“索引超出范围”。有什么想法吗?我真是太感谢你了。在数组上使用
附加
,而不是使用索引谢谢!你帮了我很大的忙,帮我找到了正确的方向!