我有一個用於製作和處理JSON API請求的泛型類。我傳入TParam
和TResult
模板參數,但是當我使用派生類型時,它的實現沒有被調用。不被稱爲泛型類模板的派生類方法
下面是一些代碼,你可以在操場扔來說明:
import Cocoa
// Base class for parameters to POST to service
class APIParams {
func getData() -> Dictionary<String, AnyObject> {
return Dictionary<String, AnyObject>()
}
}
// Base class for parsing a JSON Response
class APIResult {
func parseData(data: AnyObject?) {
}
}
// Derived example for a login service
class DerivedAPIParams: APIParams {
var user = "[email protected]"
var pass = "secret"
// THIS METHOD IS CALLED CORRECTLY
override func getData() -> Dictionary<String, AnyObject> {
return [ "user": user, "pass": pass ]
}
}
// Derived example for parsing a login response
class DerivedAPIResult: APIResult {
var success = false
var token:String? = ""
// THIS METHOD IS NEVER CALLED
override func parseData(data: AnyObject?) {
/*
self.success = data!.valueForKey("success") as Bool
self.token = data!.valueForKey("token") as? String
*/
self.success = true
self.token = "1234"
}
}
class APIOperation<TParams: APIParams, TResult: APIResult> {
var url = "http://localhost:3000"
func request(params: TParams, done: (NSError?, TResult?) ->()) {
let paramData = params.getData()
// ... snip making a request to website ...
let result = self.parseResult(nil)
done(nil, result)
}
func parseResult(data: AnyObject?) -> TResult {
var result = TResult.self()
// This should call the derived implementation if passed, right?
result.parseData(data)
return result
}
}
let derivedOp = APIOperation<DerivedAPIParams, DerivedAPIResult>()
let params = DerivedAPIParams()
derivedOp.request(params) {(error, result) in
if result? {
result!.success
}
}
真正奇怪的是,只有DerivedAPIResult.parseData()
不叫,而DerivedAPIParams.getData()
方法被調用。任何想法爲什麼?
你不應該爲你的基類使用'protocol'嗎? https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/Protocols.html – Mohsen
@Mohsen你也可以使用。如果您使用類型,則會將類限制爲該類型或派生類型。如果您使用協議,它會限制實現該協議的類型。 「[類型約束指定類型參數必須從特定類繼承,或者符合特定協議或協議組合。](https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/ swift_programming_language/Generics.html#// apple_ref/doc/uid/TP40014097-CH26-XID_244)「 –