Swift의 프로토콜과 Java의 인터페이스 비교


149

Apple 개발자 페이지 에서 iOS 튜토리얼을 진행 합니다 .

나에게 보인다 protocolinterface거의 동일한 기능을 가지고있다.

  • 둘 사이에 차이점이 있습니까?

  • 프로젝트에서 다른 사용법?

업데이트

, 나는 위의 링크를 읽어했고, 나는 확실히 아직 어떤 차이와 사이에 사용하지 않아요 protocolinterface. 이와 같은 질문을 할 때 주제에 대한 간단한 설명을보고 싶습니다. 때로는 문서에서 모든 것을 얻는 것이 어려울 수 있습니다.


1
Swift의 프로토콜과 Java의 인터페이스는 동일한 개념입니다. 참조 여기
비벡 Molkar에게

69
언어 간의 차이점에 대한 이와 같은 질문은 언어 기능을 이해하는 데 실제로 유용하다고 생각합니다. 그리고 그것들이 불필요한 의견 답변으로 이어 지거나 문서에서 답변을 찾기가 쉽지 않다고 생각합니다. 그래서 나는이 질문에 대한 투표가 정당하다고 생각하지 않습니다.
Lii

1
여기에 몇 가지의 중요한 실제 포인트 - 자바 인터페이스에 대한 stackoverflow.com/a/41143492/294884는 - 그 누구를위한 열쇠가 될 것입니다 자바 노력 스위프트 신선한
Fattie

다른 한편으로, 스위프트의 모든 영역은 "프로토콜 지향 프로그래밍"을위한 것이라는 점을 기억하는 것은 당연하다 . Swift에서 "프로토콜 확장"을 사용하면 모든 것이 편재합니다. 예를 들어 여기 에 Swift에 대한 미묘한 문제 (예 : "프로토콜 확장 정보")가 있습니다.
Fattie

2
스위프트에서는 인터페이스 대신 프로토콜 이름이 사용됩니다. C의 Objective C 헤더 파일 (무효 복제본)을 인터페이스라고 부르기 때문입니다.
Alex78191

답변:


117

기본적으로 프로토콜은 다음을 제외하고 Java 인터페이스와 매우 유사합니다.

  • 스위프트 프로토콜은 구현해야하는 속성 (예 : 필드)을 지정할 수도 있습니다.
  • 스위프트 프로토콜은 mutating 키워드를 사용하여 값 / 참조를 처리해야 합니다 (프로토콜은 구조체와 클래스로 구현할 수 있기 때문에)
  • 프로토콜 <> 키워드와 함께 언제든지 프로토콜을 결합 할 수 있습니다. 예를 들어, 프로토콜 A 및 B를 준수해야하는 함수 매개 변수를 다음과 같이 선언하십시오.

.

func foo ( var1 : protocol<A, B> ){}

이것들은 Java 개발자 (또는 적어도 지금까지 내가 찾은 것)의 즉각적인 차이점입니다.


13
" protocol <> 키워드 ": 정말 멋지다! 이것이 유형 시스템 이론 커뮤니티에서 교차 유형 이라고 생각합니다 . Java는 다중 경계가있는 유형 매개 변수에 대해서만 이러한 유형을 가질 수 있습니다. 이 백서 에서는 Java를 퍼스트 클래스 타입으로 소개하고 구문을 나타내는 구문을 제안합니다.
Lii

7
좋은 요약입니다. 몇 가지 중요한 기능 : Swift 프로토콜은 관련 유형 요구 사항을 지정할 수도 있습니다. 예를 들어 컬렉션 유형에는 관련 인덱스 유형이 있거나 비교 가능한 유형의 비교 방법에는 동일한 유형의 매개 변수가 필요합니다. 또한 Swift 2.0에서 프로토콜 확장은 프로토콜 요구 사항을 충족하는 유형에 실제 기능을 추가 할 수 있습니다.
rickster

2
@rickster Java 8도 default 키워드 로 메소드에 태그를 지정하여 인터페이스에 구현을 추가 할 수 있습니다 . Oracle Tutorial을 참조하십시오 .
Basil Bourque

5
앰퍼샌드를 위해 protocol <> 키워드가 제거되었습니다. 그래서 당신은 쓸 수 있습니다 : let c : A & B
Paul Robinson

2
스위프트에서는 인터페이스 대신 프로토콜 이름이 사용됩니다. C의 Objective C 헤더 파일 (무효 복제본)을 인터페이스라고 부르기 때문입니다.
Alex78191

33

@Thomas Schar의 답변을 보완합니다. 스위프트 프로토콜 마법은 확장에서 비롯됩니다.

  • Swift 프로토콜은 확장 (Swift
    2)을 통해 구현을 얻을 수 있습니다 . Java 8 인터페이스는 기본 구현을 가질 수 있지만 "반복적으로"수행 할 수는 없습니다.
  • Swift에서는
    클래스 또는 구조 에 프로토콜 요구 사항 (및 필요한 경우 해당 구현)을 "반복적으로"추가 할 수 있습니다 .
  • 스위프트 프로토콜은 일반 (예 : <..>) 사용자 정의 패턴을 따르지 않고 유형별 체계 (예 : 연관된 유형)를 따릅니다. 시작시 혼동 될 수 있지만
    경우에 따라 "앵글 브래킷 실명"을 피할 수 있습니다 .
  • Swift에는 고급 유형 패턴 일치 기능이있어 프로토콜 요구 사항 및 확장이 적용되는 위치와 방법을 매우 구체적으로 지정할 수 있습니다. Java에서 올 때 혼란 스러울 수 있지만 많은 힘이 있습니다.
  • 속성 / 매개 변수에 대한 빠른 프로토콜을 구성 할 수 있습니다 (예 : 축하 자 : 프로토콜)

몇 시간 동안 머리를 긁적하게 한 것은 모든 프로토콜을 속성 유형으로 사용할 수는 없다는 것입니다. 예를 들어, typealias가있는 프로토콜이있는 경우 직접 속성 유형으로 사용할 수 없습니다 (생각할 때 의미가 있지만 Java에서는 userDao : IDao와 같은 속성을 원합니다).


7
또한 Java 인터페이스와 달리 Swift 프로토콜에는 선택적 멤버가있을 수 있습니다.
eyeApps LLC

4
Swift에서 항상 나타나는 사소한 점은 추상적 기능이 (엄청나게) 없다는 것입니다. ... stackoverflow.com/a/24111430/294884
Fattie

@ 패티 함수에서 "필수"키워드를 사용하여 서브 클래스 구현이 필요함을 지정할 수 있습니다. 실제 포인트보다 약간의 무지가 더 중요합니다.
Dirk Bester

@DirkBester-건배-잠깐, 당신은 이니셜 라이저와 이야기하고 있습니까 ??
21:29의 Fattie

다시 @DirkBester 나는 약간 혼란 스러울 수 있지만 required프로토콜의 함수 전에 하나를 사용할 수 없습니다 , 당신은 단지 얻을 'required' may only be used on 'init' declarations...
Fattie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.