프로토콜 확장에서 인스턴스 메서드를 재정의하려고하는데 몇 가지 문제가 있습니다.Swift에서 프로토콜 확장에서 인스턴스 메소드를 대체하는 방법은 무엇입니까?
맥락에서 나는 다양한 UICollectionViews로 iOS 응용 프로그램을 만들고 있습니다. 이러한 뷰는 다른 데이터베이스의 데이터를 가져오고 (다른 콜백 함수가 필요함) 레이아웃이 매우 다릅니다. (데이터베이스, 레이아웃)의 모든 조합이 가능하기 때문에 방대한 코드 중복없이 멋진 OOP 클래스 계층 구조를 만드는 것은 어렵습니다.
레이아웃 기능 (주로 UICollectionViewDelegateFlowLayout 프로토콜에 정의 된 기능)을 프로토콜 확장에 포함시켜 모든 관련 레이아웃 기능을 구현하도록 확장 된 프로토콜로 주어진 UICollectionView 하위 클래스를 꾸밀 수있는 아이디어가 있었지만 그것의 힘든 시간을 보내고. 문제의 핵심은 아래 코드에 포함되어 있습니다.
class Base {
func speak(){
print("Base")
}
}
class SubA: Base, ProtocolA {}
class SubB: Base, MyProtocolB {}
protocol MyProtocolA{
func speak()
}
protocol MyProtocolB{
func speak()
}
extension MyProtocolA{
func speak(){
print("A")
}
}
extension MyProtocolA{
func speak(){
print("B")
}
}
let suba = SubA()
suba.speak() // prints "Base", I want it to print "A"
let subb = SubB()
subb.speak() // prints "Base", I want it to print "B"
생각들?
"레이아웃 기능 (주로 UICollectionViewDelegateFlowLayout 프로토콜에 정의 된 기능)을 프로토콜 확장에 넣으려는 생각이 들었습니다."그 생각은 잊어 버려. Objective-C는 프로토콜 확장을 지원할 수 없기 때문에 Objective-C는 프로토콜 확장에서 구현을 절대 호출하지 않습니다. 스위프트 전용 기능입니다. – matt
@matt이 질문은 Obj-C에 관한 것이 아닙니다. 그렇습니까? –
@TimVermeulen 네, 맞습니다. 그것은 Swift 프로토콜 확장에서 Objective-C 위임 메소드에 관한 것입니다. – matt