2017-12-28 53 views
1

さて、タイトルは多少あいまいかもしれませんが、基本的に達成しようとしているのは以下のとおりです。 私はバックエンドからデータをフェッチするために2つのクラスを使用し、したがって、両方ともinvalidateCache()メソッドを持っています。彼らはデータをフェッチするために使用されているので、それらの各々は、オブジェクトの異なる種類を返すメソッドfetch()を有する:プロトコルで戻り値に型消去を適用できますか?

class UserManager { 
    ... 
    func invalidateCache() { 
     ... 
    } 
    func fetch() -> [User] { 
     ... 
     return users 
    } 
} 

class PostManager { 
    ... 
    func invalidateCache() { 
     ... 
    } 
    func fetch() -> [Post] { 
     ... 
     return posts 
    } 
} 

それから有する1つのベース・ビュー・コントローラ二継承ビューコントローラ(例えば、UsersViewController及びPostsViewController)私は実際にそれを使用します。これら2つのView Controllerは、対応するエンティティマネージャを使用します。私は、ベース・ビュー・コントローラのプロパティの型になりますいくつかの一般的なプロトコルを持ちたいと継承されたもののそれぞれが特定の実装、このようなものだろう:私は型消去を適用しようとしたが、なかった

protocol EntityManager<Result>: class { 
    func invalidateCache() 
    func fetch() -> [Result] 
} 

class UserManager: EntityManager<User> { 
    ... 
    func fetch() -> [User] { 
     ... 
    } 
} 

class PostManager: EntityManager<Post> { 
    ... 
    func fetch() -> [Post] { 
     ... 
    } 
} 


class BaseViewController: UIViewController { 
    var manager: EntityManager? 
    override func viewDidDisappear() { 
     manager?.invalidateCache() 
    } 
} 

class UserViewController: BaseViewController { 
    var users: [User]? 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     manager = UserManager() 
     users = manager?.fetch() 
    } 
} 

class PostViewController: BaseViewController { 
    var posts: [Post]? 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     manager = PostManager() 
     posts = manager?.fetch() 
    } 
} 

をどのような方法でも成功する(私はタイプ消去適用の分野を完全には理解していないと思われる)。私が理解する限り、迅速なコンパイラは、コンパイル時に型が一義的でなければならないことを要求します。なぜ私の場合にあいまいさがあるのか​​理解できません。

答えて

0

共通のものを使用するには、UserとPostが必要です。たとえば、

protocol Fetchable { } 
class User: Fetchable { } 
class Post: Fetchable { } 

class Manageable<T> { 
    func fetch() -> [T] { return [] } 
} 
class UserManager: Manageable<User> { 
    override func fetch() -> [User] { return [] } 
} 
class PostManager: Manageable<Post> { 
    override func fetch() -> [Post] { return [] } 
} 

let users = UserManager().fetch() 
print("users=\(users)") 
let posts = PostManager().fetch() 
print("posts=\(posts)") 
関連する問題