你好,我很难正确地将方法调用到控制器上,因为我遇到此错误无法分配type'(('(('type'[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呼叫
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{
}
}
}
您的函数getVersionFromAPI
设置了异步任务,然后在任务完成之前立即返回,将void
返回其呼叫者。这就是为什么您会收到报告错误的原因。
该任务将异步任务产生的[Version]
值传递给传递给getVersionFromAPI
的完成函数。您通过{_ in }
的完成函数什么都没做,因此版本的列表简单地丢弃了。
您不能简单地调用异步任务,该任务将在以后的某个时间内完成,从同步任务(在您的情况下getVersionFromAPI
(,并以某种方式具有异步任务,并立即返回其未来结果。
您需要研究异步设计。然后重新设计您的代码,以便getVersionFromAPI
完成的任务本身是异步的,或者使用标准技术之一来阻止您的同步方法继续执行直到异步完成。
如果修改设计后,您在代码上遇到麻烦,请提出一个新问题,显示您的代码,毫无疑问,有人会帮助您。
hth
versions = api.getVersionFromAPI(completion: ({_ in }))
getversionfromapi不会返回任何东西。声明全局结构,然后将数据传递到其中,并在完成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 {
.....
}
}