2016-08-08 4 views
0

관련 검색을위한 필터를 표시하는 화면이있는 iOS 응용 프로그램을 개발 중입니다. 이제는 모든 필터가 사용자 정의 UIView로 변경되었습니다. 모든 UI가 상당히 다르기 때문에 다른 화면에서 다시 사용해야하기 때문입니다. 그들의 차이점을 생각해 보면 View Controller에 대한 공통 인터페이스를 관리하는 View Controller에 표시되므로 View Controller는 filterView가 무엇을 어떻게하는지와 관계가 없습니다. 이는 일부 데이터를 전달하고 모든 데이터를 공유하는 속성을 통해 상태를 검색하는 것과 관련이 있습니다. 그들은 모두 UIView의 하위 클래스 인 FilterView의 하위 클래스 인 다른 클래스를 가지고 있습니다. 이 FilterView 클래스는 이러한 모든 하위 클래스가 채택하는 인터페이스를 제공합니다.서브 클래스 또는 프로토콜, 방법?

이 방법론은 정상적으로 작동하지만 filterView에서 제공해야하는 모든 메서드와 속성은 기본 클래스 인 FilterView에서 선언되고 일부 특정 필터는 동작을 구현하지 않으면 해당 동작은 기본적으로 해당 동작에 의해 제공됩니다. 슈퍼 클래스 FilterView. 나는 이것을 원하지 않는다. 모든 FilterView 서브 클래스는 FilterView API에서 구현을 제공하거나 그렇지 않으면 수퍼 클래스의 기본값이 아닌 자신의 기본값을 제공해야합니다.

나는 또한 요구 사항입니다 수 UIViews을 강제적으로 이러한 모든 클래스 나는 능력을 잃어이 동작을 구현하는 프로토콜을 사용하는 경우.

당신은 내가 더 잘 모든 다른 FilterView 서브 클래스를 관리하는 데 사용한다 어떤 디자인 패턴을 제안 할 수 있습니다. 모든 필터 개체보다는 명시 적으로 하나 되 UIView를 제공 할 필요가 있다고 생각하면

+0

http://stackoverflow.com/a/1034464/2518285- "추상 클래스가 실제로 인터페이스 (예 : 구체적인 구현 방법이 없음) Objective-C 프로토콜을 사용하는 것이 더 적절한 옵션입니다. " –

+0

http://stackoverflow.com/a/11145006/2518285 –

답변

2

글쎄, 당신은 프로토콜이 요구 사항을 추가 할 수 있습니다. 예를 들어 :

@protocol FilterObject 

- (UIView *)viewForFilter; 

@end 

// Swift 
protocol FilterObject { 
    func viewForFilter() -> UIView 
} 

을 그리고 실제로 UIView의이 클래스에 단지 이런 식으로 구현 : 완성도를 위해서

- (UIView *)viewForFilter { 
    return self; 
} 

// Swift 
func viewForFilter() -> UIView { 
    return self 
} 

, 할 수도 있습니다 종류의 "힘"는

: 요구 사항은 자신의 기본 구현이 호출 예외를 던져 subclassess의 메소드를 구현하는 0

이 패턴은 오브젝티브 C/스위프트 수업을 통해이 "추상적"외부 라이브러리의 일부 foound 할 수 있도록합니다. Swift에서는 동적 디스패치가 없으므로이를 구현하기가 더 어렵습니다. 즉, 하위 클래스를 기본 클래스로 캐스팅하고 메소드를 호출하면 기본 구현이 호출됩니다. 프로토콜 접근 방식이 더 안전하므로 앱을 크래시하는 경로를 만들지 않기 때문에 반대하는 방법을 권합니다. 나는이 예를 단지 가능성과 완전성을 설명하기 위해 추가했다.

0

비 선택 방법과 프로토콜을 정의는 - ". 기본적으로 프로토콜에 선언 된 모든 메소드는 방법을 필요이 프로토콜을 준수하는 모든 클래스는 그 메소드를 구현해야한다는 것을 의미합니다." 프로토콜을 구현한다고 선언하는 클래스를 정의하십시오. 부모 클래스의 서브 클래스를 작성 지금 때, 필수 방법 (들)

슈퍼 클래스의

을 구현하지 않을 경우 오류 등의 컴파일러 의지 플래그 당신은 쓸 수

//In super class 
- (id)someMethod:(aObject*)param 
{ 
    [self doesNotRecognizeSelector:_cmd]; 
    return nil; 
} 

귀하 서브 클래스는이 메소드를 구현하지 않을 경우 응용 프로그램이 충돌합니다 그리고 당신은 Filter라는 이름의 프로토콜에 공통 인터페이스를 정의하고 필터를 정의하여 신속한 네 지금 명확하게 표현 될 수

[super someMethod: param]; 
+0

프로토콜을 사용하지 않고 이미이 작업을 수행 할 수 있습니다. 기본 클래스의 메소드는 fatalError 생성하도록 구현할 수 있습니다. 내가 원하는 것은 이러한 공통 인터페이스를 모두 UIViews 보장 함께 함께 표현할 수있는 형식입니다 .Objc에서 이러한 뷰를 보유하는 변수를 하지만 Swift에서는이를 수행 할 수 없습니다. – Pranshu

0

이를 호출 할 필요는 없다 보기 :

typealias FilterView = UIView & Filter