Swift3 无法将 '()' 类型的值分配给类型 '[Version]'



你好,我很难正确地将方法调用到控制器上,因为我遇到此错误无法分配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 {
           .....
     }
}

相关内容

最新更新