我試圖使用flatMap在Swift中構建一個Resource<T>
,但不斷收到一個奇怪的錯誤,並且只在我強制轉換時才起作用。Swift flatMap和泛型
Resource<T>
:
public struct Resource<T> {
let record: CKRecord
let parser: [String: AnyObject] -> T?
}
工作代碼:
public func buildResource<T>(resource: Resource<T>) -> T? {
var dataJson: [String: AnyObject] = [:]
dataJson["recordID"] = resource.record.recordID
for name in resource.record.attributeKeys {
dataJson[name] = resource.record[name]
}
return (dataJson as? [String: AnyObject]).flatMap(resource.parser)
}
上面的代碼給出了一個警告,強制轉換總是成功的,這是真的。但是,當我嘗試刪除像這樣的演員陣容:
public func buildResource<T>(resource: Resource<T>) -> T? {
var dataJson: [String: AnyObject] = [:]
dataJson["recordID"] = resource.record.recordID
for name in resource.record.attributeKeys {
dataJson[name] = resource.record[name]
}
return dataJson.flatMap(resource.parser)
}
它給出以下錯誤:'flatMap' produces '[S.Generator.Element]', not the expected contextual result type 'T'?
。
解析器是struct init
像這樣:
struct Example {
let name: String
let id: Int
}
extension Example {
init?(dataJson: [String: AnyObject]) {
guard let name = dataJson["name"] as? String else {
return nil
}
guard let id = dataJson["id"] as? Int else {
return nil
}
self.name = name
self.id = id
return
}
}
任何想法如何解決這一問題或不同的做法?這裏的想法是將任何CKRecord輕鬆轉換爲結構體,而無需編寫大量樣板代碼。
但不會這也導致改變'struct'的初始值設定項? – Victor
@Victor是的:)我並不是暗示不需要其他更改,只是代碼中的錯誤位於該位置。 –