2017-04-23 51 views
-1

你好我無法正確調用我的方法到控制器,因爲我收到此錯誤無法指定'()'類型的值鍵入' [版]'。我需要幫助解決這個問題,謝謝。Swift3無法指定'()'類型的值來鍵入'[版本]'

斯威夫特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 

     } 
    } 
} 

斯威夫特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{ 

    } 
    } 
} 

回答

0

你的功能getVersionFromAPI設置了一個異步任務,然後立即這個任務完成之前,返回void它的調用者返回。這就是爲什麼你會得到你報告的錯誤。

由異步任務生成的[Version]值由該任務傳遞給傳遞給getVersionFromAPI的完成函數。您通過{_ in }的完成功能什麼都不做,所以版本列表將被丟棄。

您不能簡單地從同步任務getVersionFromAPI中調用異步任務,該異步任務將在將來某個時間完成,並且讓異步任務以某種方式變爲同步並立即返回其未來結果。

您需要研究異步設計。然後,重新設計代碼,以使getVersionFromAPI完成的任務本身是異步的,或者使用其中一種標準技術阻止同步方法繼續執行,直到異步方法完成。

如果在修改設計之後,您的代碼出現問題,請提出一個新問題,顯示您的代碼,並且有人會毫無疑問地幫助您。

HTH

0
versions = api.getVersionFromAPI(completion: ({_ in })) 

getVersionFromAPI不返回任何東西。聲明接着一個全球性的結構中的數據傳遞到它和成品張貼NotificationCentre時使用DispatchQueue

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) 
     } 
    } 
} 

您的斯威夫特3視圖控制器應具備以下條件:

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 { 
      ..... 
    } 
} 
+0

進出口新的swift3你能告訴我代碼如何設置通知觀察者 – codeNinjaBro

+0

我編輯了我的答案以包含通知調用 –

相關問題