2016-12-05 96 views
0

我正在嘗試實現一些網絡代碼,它將在端點獲取json,然後將結果解析爲CoreData對象。Swift 3 - 使用靜態方法的協議,使用泛型類型的實例方法,可選的'.Type'參數

我定義了一個協議JSONParsable,我的一些CoreData對象類符合。

import SwiftyJSON 
import CoreData 

protocol JSONParsable { 

// you validate the json response from the server to make sure it has everything you expect to function properly 
static func validate(_ jsonResponse: JSON) throws 

// now parse the jsonResponse 
static func parseAll<T: NSManagedObject>(_ jsonResponse:JSON, into context:NSManagedObjectContext) -> [T]! 

// describes how to parse one data object in a json response 
static func parse<T: NSManagedObject>(_ jsonObject:JSON, into context:NSManagedObjectContext) -> T? 

} 

爲什麼?因爲它們是該類型對象的實用方法。所以,我的網絡客戶端上的「GET對象」方法「經理人」基本上是這樣的:

private func get<T:JSONParsable>(_ urlString: URLConvertible, expectedObjectType:T.Type?, completion: @escaping (_ success: Bool) -> Void) 

的問題是,如果expectedObjectType是有史以來爲零,編譯器會抱怨有一個錯誤:

Generic parameter 'T' could not be inferred 

我不知道如何解決這個問題。我想我在某個地方採取了錯誤的做法,仍然來自Objective-C世界。希望得到一些幫助,如果有必要,還會採取其他方法。

我基本上是說「讓json訪問特定的URL並使用特定的類擴展來解析它。」

我也想我可以實現'虛擬類'並提供這個?似乎有點骯髒,但不是我們不時有點髒嗎? :)

+1

實際上總是有一個*預期類型*,不是嗎?那爲什麼它是可選的呢? – vadian

+0

,因爲有時候不需要解析。爲了簡潔,我沒有公開整個API調用。完成塊也通過json對象。 – horseshoe7

回答

0

答案不完全是答案,只能說我改變了方法。我創建了一個顯式的解析器對象,將協議定義更改爲實例方法,並且解析器對象仍然是屬於網絡客戶端的「服務」對象的成員。

它的工作方式很好,因爲json解析涉及到提供JSON的端點。

相關問題