4

flatMap を使用して Swift でビルドしようとしていますResource<T>が、奇妙なエラーが発生し続け、キャストを強制した場合にのみ機能します。

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 を構造体に簡単に変換することです。

4

2 に答える 2