2017-02-01 3 views
1

나는 프로토콜과 프로토콜 확장이 추상 클래스를 에뮬레이션하는 가장 좋은 방법이라는 것을 알고 있지만, 내가하고 싶은 것은 실제 추상 클래스가 필요하다고 생각한다.Swift의 추상 클래스

함께 작동하는 BaseCollectionViewCellBaseCollectionViewSource을 원합니다. 배열을 BaseCollectionViewSource의 하위 클래스에 전달하고 재사용 식별자를 반환하는 메서드를 구현합니다. 셀은 BaseCollectionViewSource에 의해 인스턴스화되고 콘크리트 컬렉션ViewCell에서 재정의되는 setData 메서드를 가질 수 있습니다.

abstract class WRBaseCollectionViewCell: UICollectionViewCell { 
    abstract func setData(_ data: AnyObject) 
} 

하지만 스위프트 (나는 생각한다) 이것을 모방 할 수 없습니다

은 내가 실제로하고 싶은 것은 이것이다. 프로토콜은 클래스에서 상속받을 수 없으며 동적 인 디스패치가 없기 때문에 모든 것을 재정의 할 수있는 아이디어를 얻지 못합니다.

누구나 어떻게 할 수 있습니까? 아마 공장? 나는 새로운 collectionView를 구현하기 위해 이것을 가능한 한 쉽게 만들고 싶다.

+0

Swift에는 추상 클래스가 없습니다. IMO는 필요하지 않습니다. 범용 프로토콜과 프로토콜 (특히 * 프로토콜 확장 *)을 사용하면 신속하게 풍부한 도구 세트를 제공 할 수 있습니다. – vikingosegundo

+0

@vikingosegundo 내 문제에 대한 구체적인 해결책이 있습니까? 나는 언어가 변경되도록 요구하지 않고 가능한 한 최선을 구현하고자합니다. 특정 예제로 인해 – vrwim

+0

이 있습니다. 최근에 시작한 프로젝트, 컬렉션 및 테이블 뷰용 데이터 소스 프레임 워크 인 [TaCoPopulator] (https://github.com/vikingosegundo/TaCoPopulator)를 살펴볼 수 있습니다. – vikingosegundo

답변

1

흠, 당신이 원하는 것이 확실하지 않습니다. 다음 프로토콜을 살펴보십시오.

protocol SetDataViewCell {} 

extension SetDataViewCell where Self: UICollectionViewCell { 
    func setData(_ data: AnyObject) {} 
} 
4

참고로 add Abstract classes/methods에 대한 제안이 있지만 현재 다릅니다. 나는 그들이 내년이나 2 년 안에 다시 검토 할 것이라고 추측합니다.

나는 것은 이런 종류의 작업을 수행하는 방법은 관련 유형의 프로토콜을 사용하는 것입니다 :

protocol ViewModelUpdatable { 
    associatedtype ViewModelType 
    func update(with viewModel: ViewModelType) 
} 

그리고 단순히 클래스가 준수하게하고, 추가하도록 강요합니다

func update(with viewModel: WhateverTypeYouWant) { 
    //update your class 
} 

이 접근법의 장점은 더 일반적인 방법으로 클래스를 처리 할 수 ​​있지만 유형 안전을 유지할 수 있다는 것입니다.

언젠가이 문제를 다루기를 희망하는 방식은 제네릭이지만, InterfaceBuilder는 여전히 제네릭으로 깨져 있습니다.