您好我无法正确调用控制器的方法,因为我收到此错误无法指定类型'()'的值来键入'[Version]'。我需要帮助解决这个问题,谢谢。
Swift 3方法:
var versions : [Version] = []
func isActiveVersion() -> Bool {
let api = versionAPI()
versions = api.getVersionFromAPI(completion: ({_ in }))
for version in versions{
if version["version"] == "1.0.0" {
return true
}
}
}
Swift 3 Call
public class versionAPI {
var versions : [Version] = []
//---------------------------------
// MARK: ENDPOINTS
//---------------------------------
let getVersionEndPoint = "http://127.0.0.1:3000/api/v1/versions"
//---------------------------------
// MARK: REQUESTS
//---------------------------------
func getVersionFromAPI(completion: @escaping ([Version]) -> Void){
let url = URL(string: getVersionEndPoint)
let task = URLSession.shared.dataTask(with: url! as URL) { data, response, error in
guard let data = data, error == nil else {
completion([])
return
}
print(NSString(data: data, encoding: String.Encoding.utf8.rawValue)!)
self.parseVersionsToJSON(data: data)
completion(self.versions)
}
task.resume()
}
func parseVersionsToJSON(data: Data) {
do {
self.versions = []
if let json = try JSONSerialization.jsonObject(with: data) as? [[String:Any]] {
for dic in json {
let version = Version()
version.version = dic["version"] as! String
version.active = dic["active"] as! Bool
self.versions.append(version)
}
}
}
catch{
}
}
}
答案 0 :(得分:0)
您的函数getVersionFromAPI
设置异步任务,然后在该任务完成之前立即返回,将void
返回给其调用者。这就是您收到报告错误的原因。
异步任务生成的[Version]
值由该任务传递给传递给getVersionFromAPI
的完成函数。您传递的完成功能{_ in }
不执行任何操作,因此简单地丢弃版本列表。
您不能简单地调用异步任务,该异步任务将在未来的某个时间完成,从您的情况下的同步任务getVersionFromAPI
开始,并使该异步任务以某种方式变为同步并立即返回其未来结果。
您需要学习异步设计。然后重新设计代码,以便getVersionFromAPI
完成的任务本身是异步的,或者使用一种标准技术阻止同步方法继续进行,直到异步方法完成。
如果在修改您的设计后,您的代码出现问题,请提出新问题,显示您的代码,毫无疑问,有人会帮助您。
HTH
答案 1 :(得分:0)
versions = api.getVersionFromAPI(completion: ({_ in }))
getVersionFromAPI不会返回任何内容。声明一个全局结构,然后将数据传递给它,并在完成后使用DispatchQueue发布NotificationCentre
do {
GlobalStruct.versions = []
if let json = try JSONSerialization.jsonObject(with: data) as? [[String:Any]] {
for dic in json {
let version = Version()
version.version = dic["version"] as! String
version.active = dic["active"] as! Bool
GlobalStruct.versions.append(version)
}
DispatchQueue.main.async {
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "gotIt"), object: nil)
}
}
}
您的Swift 3 ViewController应具有以下内容:
var versions: [Version] = []
func viewDidLoad() {
NotificationCenter.default.addObserver(self, selector: #selector(myFunction), name: NSNotification.Name(rawValue: "gotIt"), object: nil)
let api = versionAPI()
api.getVersionFromAPI()
super.viewDidLoad()
}
func myFunction() {
versions = GlobalStruct.versions
if isActiveVersion {
.....
}
}