Swift3无法指定类型'()'的值来键入'[Version]'

时间:2017-04-23 05:21:49

标签: swift

您好我无法正确调用控制器的方法,因为我收到此错误无法指定类型'()'的值来键入'[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{

    }
  }
 }

2 个答案:

答案 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 {
           .....
     }
}