2016-07-02 4 views
0

스위프트의 프로토콜 지향 프로그래밍과 확장 기능의 작동 방식 및 제공 할 수있는 확장 성 수준.스위프트 프로토콜 지향 확장

Extension - doSomethingA Self: ProtocolB, ProtocolC 

내가 실행하는 모든 확장을 보장 할 수 있다는 것을 어쨌든 거기 :

내가 내가 인쇄되는 것은 놀이터

protocol ProtocolA { 
    func doSomethingA() 
} 

protocol ProtocolB { 
    func doSomethingB() 
} 

protocol ProtocolC { 
    func doSomethingC() 
} 

extension ProtocolA { 
    func doSomethingA() { 
     print("Extension - doSomethingA") 
    } 
} 

extension ProtocolA where Self: ProtocolB { 
    func doSomethingA() { 
     print("Extension - doSomethingA Self: ProtocolB") 
    } 
} 

extension ProtocolA where Self: ProtocolC { 
    func doSomethingA() { 
     print("Extension - doSomethingA Self: ProtocolC") 
    } 
} 

extension ProtocolA where Self: ProtocolB, Self: ProtocolC { 
    func doSomethingA() { 
     print("Extension - doSomethingA Self: ProtocolB, ProtocolC") 
    } 
} 

extension ProtocolB { 
    func doSomethingB() { 
     print("Extension - doSomethingB") 
    } 
} 

extension ProtocolC { 
    func doSomethingC() { 
     print("Extension - doSomethingC") 
    } 
} 

class Implementation: ProtocolA, ProtocolB, ProtocolC { 
} 

let obj = Implementation() 

obj.doSomethingA() 

을 통해 실행 한 다음 코드 되세요.

이상적인 결과는 다음과 같습니다. 내가 ProtocolA이 ProtocolB 및 ProtocolC 모두 일치하는 구현을 제공하지 않으면 내가 스위프트는, 그것의 측면에서 가장 강한 일치를 선택할 것이라는 점을 이해한다

Extension - doSomethingA 
Extension - doSomethingA Self: ProtocolB 
Extension - doSomethingA Self: ProtocolC 
Extension - doSomethingA Self: ProtocolB, ProtocolC 

사실, 유형, 난 컴파일 타임 오류가 발생합니다. 이 문제를 해결할 수있는 방법이 있습니까?

감사합니다.

+1

원하는 모든 작업 *** ***? – Fattie

+0

@JoeBlow 맞아. – Peymankh

+0

의미합니까? 코드에 이것을 입력하면 :'obj.doSomethingA()'는 네 개의 다른 루틴을 * 실행하려고합니다. 그래서, 당신이 상속의 사슬에서 "슈퍼 ...."네 번 4 번, 잘 세 번 전화했는지? – Fattie

답변

2

확장의 요령은 프로토콜 구현을 위해 기본 구현을 제공하는 것입니다.

예에서 컴파일러는 구체적인 개체에 가장 적합한 확장명 doSomethingA() 메서드를 호출하는 것으로 해결되지만 그게 전부입니다. 당신은 전화 당신의 관점에

볼 수 있듯이 : 당신은 메소드 호출을 수행하는

obj.doSomethingA()

. 이 문제는 해결되어 4 건이 아니라 하나의 메소드 호출로 전달됩니다.

하위 클래 싱을 통해 메서드를 재정의하고 기본 클래스의 메서드를 호출 할 때와 비슷하지만 파생 메서드 만 호출되고 기본 클래스는 호출되지 않습니다. 이 경우 원하는 경우 서브 클래스에서 super.method()으로 전화 할 수 있습니다.

class A: ProtocolA, ProtocolB, ProtocolC { 

    func all() { 
     doSomethingA() 
     doSomethingB() 
     doSomethingC() 
    } 
} 

장점의 : 당신이 전화지고 다양한 방법을 원하는 경우 귀하의 경우에는

는, 당신은 단지 모든 프로토콜과 같이 구현하는 클래스를 생성, 확장을 통해 그들에게 별도의 이름과 구현을 제공 할 수 있습니다 여기서 확장은 class A이 세 가지 메소드에 대한 구현을 제공 할 필요가 없다는 것입니다.

+0

충분합니다. 감사. – Peymankh