2016-11-24 17 views
5

私はこれをコンパイルしようとするたびに値を変換できません、私はエラーを取得します私は解決策を見出そうとしましたが、役に立つと思われるものは何も見つかりませんでした。ここで は私のコードです:はタイプ予想される引数の型に「[T]」「[_]」

class FetchRequest <T: NSManagedObject>: NSFetchRequest<NSFetchRequestResult> { 
     init(entity: NSEntityDescription) { 
     super.init() 
     self.entity = entity 
    } 
    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
    typealias FetchResult = (success: Bool, objects: [T], error: NSError?) 
    func fetch <T> (request: FetchRequest<T>, 
        context: NSManagedObjectContext) -> FetchResult { 
     do { 
     let results = try context.fetch(request) 
      return FetchResult(true, results as! [T], nil) 
     } catch let error as NSError { 
     return (false, [], error) 
     } 
    } 
} 

EDIT:

私は、この行のエラーを取得:

return FetchResult(true, results as! [T], nil) 
+0

詳細をお知らせください:どこでエラーが発生しますか?エラーを示す最小限の例にコードを縮小できますか? – Tali

+0

完了、ファイルにエラーが発生した場所を示す編集を追加しました。申し訳ありません。 – Nick

+0

'fetch' *インスタンス*メソッドはなぜ' request: 'パラメータを取るのですか? 'self'を使わないのはなぜですか? – Hamish

答えて

3

問題は、あなたがTと呼ばれる2つの一般的なプレースホルダの種類を持っているということです。 1つはクラススコープに、もう1つはメソッドスコープにあります。あなたのfetchメソッドの戻り値の型である、あなたのFetchResult型の別名で使用されるクラススコープTとは無関係です - あなたはresults as! [T]を言うとき、あなたは方法スコープでTに言及しています。

そこであなたは、単に、まだあなたのプレースホルダの1、またはそれ以上の名前を変更する方法から、一見冗長request:パラメータを排除し、だけではなく、selfを使用する必要があります。

func fetch(inContext context: NSManagedObjectContext) -> FetchResult { 
    do { 
     let results = try context.fetch(self) 
     return (true, results as! [T], nil) 
    } catch let error as NSError { 
     return (false, [], error) 
    } 
} 

今、あなたは単に上fetch(inContext:)を呼び出すことができますFetchRequestフェッチするインスタンス。

関連する問題