這一直纏着我。我想用Moya + ReactiveCocoa和json-swift。無法從符合Equatable對象向下轉換AnyObject
這似乎並不容易,而不需要重寫一些這些框架截至看來我需要返回一個AnyObject和尚未建立一些數據符合Equatable,因此不允許這樣一個點。
這裏是一個玩具遊樂場就緒例子來說明的錯誤消息與
struct JSValue: Equatable {
let value:String
}
func ==(lhs: JSValue, rhs: JSValue) -> Bool {
return (lhs.value == rhs.value)
}
var jsv = JSValue(value: "abc")
var anyValue = jsv as AnyObject
最後一行的錯誤這個「無法垂頭喪氣從JSValue到非@ objc協議類型‘AnyObject’」 。
我通常只是避免投射到AnyObject,但我一直在嘗試使用an implementation of JSValue from json-swift並重復the pattern described inside Moya's implementation of ReactiveCocoa seen with the usage of tryMap here。在Moya + RACSignal擴展中,tryMap所需的回調的簽名要求返回AnyObject。
對於那些希望看到的例子不是瞭解情況,這裏是我的意思是:
import Foundation
import Moya
import ReactiveCocoa
import JSONLib
/*
let MoyaErrorDomain = "Moya"
public enum MoyaErrorCode: Int {
case ImageMapping = 0
case JSONMapping
case StringMapping
case StatusCode
case Data
}
*/
public typealias JSParsingResult = (value: JSValue?, error: Error?)
/// Extension for processing raw NSData generated by network access.
public extension RACSignal {
/// Maps data received from the signal into a literal JSON type. If the conversion fails, the signal errors.
public func mapLiteralJSON() -> RACSignal {
return tryMap({ (object, error) -> AnyObject! in
var json:AnyObject?
if let response = object as? MoyaResponse {
let parsingResult = JSON.parse(response.data)
json = parsingResult.value! as AnyObject // The same error message as described previously.
}
// Note: ignore that I am not handling errors yet...
/*
if json == nil && error != nil && error.memory == nil {
var userInfo: [NSObject : AnyObject]?
if object != nil {
userInfo = ["data": object]
}
error.memory = NSError(domain: MoyaErrorDomain, code: MoyaErrorCode.JSONMapping.toRaw(), userInfo: userInfo)
}
*/
return json
})
}
}
是否有解決此錯誤消息的所有快捷方式,或者是我唯一的選擇使用( 1)解析JSON的不同方法,該方法不符合Equatable,或(2)重寫莫亞使用the other version of ReactiveCocoa in which tryMap does not return AnyObject,或(3)不使用ReactiveCocoa。
這將是非常好的避免AnyObject妥善解決這個問題,但在這一點上,我可能既缺少斯威夫特和ReactiveCocoa能力這樣做......
在非技術層面,有什麼辦法在這附近?減少我對未完成技術的接觸會是明智的嗎?
如果你把它變成一個類而不是一個結構會怎樣? – Arno 2014-09-24 13:45:43
問題是我不控制這段代碼。符合Equatable的結構來自json-swift在Swift中更好地處理JSON的抽象。 – olive 2014-09-24 13:47:02
當然,您不能將結構向下翻到「AnyObject」,但是可以將結構強制轉換爲「Any」類型。 – tikhop 2014-09-24 13:57:27