Swift 复制时返回的无数据";“工作”;json数据到新的struc数组
奇怪。我发誓这是有效的,但后来就停止了。。或请忽略i+i,我会清理这个 我不知道为什么,但是Swift 复制时返回的无数据";“工作”;json数据到新的struc数组,swift,Swift,奇怪。我发誓这是有效的,但后来就停止了。。或请忽略i+i,我会清理这个 我不知道为什么,但是myrecords?[I]。title返回零。json.releases[i].date_adde运行良好,数据丰富。我可以“打印”它并得到结果。但当我把它复制到myrecords时,它返回零 我从JSON下载数据,效果很好。然后我尝试将数据复制到一个struc数组中,我可以在我的应用程序的其他部分找到它,现在我的myrecords数据是空的。我到底做错了什么 import Foundation var
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。是的,坏习惯或者更像,我正在学习:(我真的很感谢你!我按照你的建议做了,现在我得到了“索引超出范围”。有什么想法吗?我真是太感谢你了。在数组上使用附加,而不是使用索引谢谢!你帮了我很大的忙,帮我找到了正确的方向!