2017-12-28 92 views
1

자, 제목이 조금 모호 할 수도 있지만, 기본적으로 달성하고자하는 것은 다음과 같습니다. 내가 백엔드에서 데이터를 반입하는 데 사용하는 클래스 두 개를 가지고 있다고 가정 해 봅시다. 둘 다 반입 된 데이터를 캐시합니다 따라서 그들은 둘 다 invalidateCache() 메소드를 가지고 있습니다. 그들은 데이터를 가져 오는에 사용되기 때문에, 그들 각각은 또한 객체의 다른 종류를 반환하는 방법 fetch() 있습니다프로토콜에서 반환 값에 유형 삭제를 적용 할 수 있습니까?

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

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

그럼이 하나의 기본 뷰 컨트롤러와 두 개의 상속 뷰 컨트롤러 (예를 들어, UsersViewControllerPostsViewController) 나는 실제로 그것을 사용합니다. 이 두 개의 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

공통점이있는 사용자와 게시물이 필요합니다. 예 :

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)")