Я пытаюсь использовать flatMap для сборки Resource<T>
в Swift, но продолжаю получать странную ошибку и работает только при принуждении к приведению.Swift flatMap и generics
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 Да :) Я не подразумевал, что никаких других изменений не было, просто ошибка в коде была в этом месте. –