Swift-从一个返回数组的函数中创建一个堆栈(Text视图)



我正试图从一个返回参数数组的函数中创建一个文本对象列表。一切似乎都很好,得到了数据,控制台显示了正确的结果,除了列表本身仍然是空的。

函数调用:

import UIKit
import SwiftUI
struct SubdomainsList: View {
@State var SubDomains = VTData().funky(XDOMAIN: "giphy.com")

var body: some View {
VStack {
List{
Text("Subdomains")
ForEach(SubDomains, id: .self) { SuDo in
Text(SuDo)
}
}
}
}
}
struct SubdomainsList_Previews: PreviewProvider {
static var previews: some View {
SubdomainsList()
}
}

Json处理程序:

struct VTResponse: Decodable {
let data: [VT]
}
struct VT: Decodable {
var id: String
}

类别:

class VTData {
func funky (XDOMAIN: String) -> Array<String>{
var arr = [""]
getDATA(XDOMAIN: "(XDOMAIN)", userCompletionHandler: { (SubDomain) in
print(SubDomain)
arr.append(SubDomain)
return SubDomain
})
return arr
}


func getDATA(XDOMAIN: String, userCompletionHandler: @escaping ((String) -> String))  {
let token = "<TOKEN>"
guard let url = URL(string: "https://www.lalalla.com/subdomains") else {fatalError("Invalid URL")}
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.setValue("(token)", forHTTPHeaderField: "x-apikey")

let task = URLSession.shared.dataTask(with: request, completionHandler: { data, response, error in
guard let data = data else { return }
let decoder = JSONDecoder()
let result = try? decoder.decode(VTResponse.self, from: data)
if let result = result {
for SubDo in result.data {
let SubDomain = SubDo.id
userCompletionHandler(SubDomain)
}
}
else {
fatalError("Could not decode")
}
})
task.resume()
}

}

我没有得到任何错误,控制台输出显示了正确的结果:

support.giphy.com
cookies.giphy.com
media3.giphy.com
i.giphy.com
api.giphy.com
developers.giphy.com
media.giphy.com
x-qa.giphy.com
media2.giphy.com
media0.giphy.com

还值得一提的是,当我将print(type(of: SubDomain))添加到代码中时,我得到的是一个String,而不是一个数组。

预览:预览

有什么想法吗?

再次尝试这种方法,从API中提取subdomain的列表,并将它们显示在使用异步函数getDATA(...):的List

class VTData {

// `func funky` is completely useless, remove it

func getDATA(XDOMAIN: String, completion: @escaping ([String]) -> Void) { // <-- here
let token = "<TOKEN>"
guard let url = URL(string: "https://www.virustotal.com/api/v3/domains/(XDOMAIN)/subdomains") else {
print("Invalid URL")
return
}
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.setValue("(token)", forHTTPHeaderField: "x-apikey")

URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data else { return } // todo return some error msg
do {
let results = try JSONDecoder().decode(VTResponse.self, from: data)
return completion(results.data.map{ $0.id }) // <-- here
} catch {
print(error) // <-- here important
}
}.resume()
}

}
struct SubdomainsList: View {
@State var subDomains: [String] = []  // <--- here

var body: some View {
VStack {
List{
Text("Subdomains")
ForEach(subDomains, id: .self) { SuDo in
Text(SuDo)
}
}
}
.onAppear {
// async function
VTData().getDATA(XDOMAIN: "giphy.com") { subs in  // <--- here
subDomains = subs
}
}
}
}

最新更新