자, 제목이 조금 모호 할 수도 있지만, 기본적으로 달성하고자하는 것은 다음과 같습니다. 내가 백엔드에서 데이터를 반입하는 데 사용하는 클래스 두 개를 가지고 있다고 가정 해 봅시다. 둘 다 반입 된 데이터를 캐시합니다 따라서 그들은 둘 다 invalidateCache()
메소드를 가지고 있습니다. 그들은 데이터를 가져 오는에 사용되기 때문에, 그들 각각은 또한 객체의 다른 종류를 반환하는 방법 fetch()
있습니다프로토콜에서 반환 값에 유형 삭제를 적용 할 수 있습니까?
class UserManager {
...
func invalidateCache() {
...
}
func fetch() -> [User] {
...
return users
}
}
class PostManager {
...
func invalidateCache() {
...
}
func fetch() -> [Post] {
...
return posts
}
}
그럼이 하나의 기본 뷰 컨트롤러와 두 개의 상속 뷰 컨트롤러 (예를 들어, UsersViewController
및 PostsViewController
) 나는 실제로 그것을 사용합니다. 이 두 개의 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()
}
}
을 어떤 방식 으로든 성공합니다 (필자는 유형 삭제 응용 분야를 완전히 이해하지 못하고 있다고 생각합니다). 필자가 아는 한, 신속한 컴파일러는 컴파일 타임 동안 타입이 일 의성을 가져야한다고 요구하고, 필자의 경우 애매한 점을 이해하지 못한다.