So sánh Giao thức trong Swift vs Giao diện trong Java


149

Tôi đang xem hướng dẫn iOS từ trang nhà phát triển của Apple .

Dường như với tôi điều đó protocolinterfacegần như có chức năng tương tự.

  • Có sự khác biệt nào giữa hai người không?

  • cách sử dụng khác nhau trong dự án?

Đã cập nhật

, tôi đã đọc liên kết ở trên và tôi vẫn không chắc sự khác biệt và cách sử dụng giữa protocolinterface. Khi tôi hỏi một câu hỏi như thế này, tôi muốn xem một lời giải thích đơn giản về chủ đề này. Đôi khi nó có thể là khó khăn để có được mọi thứ từ các tài liệu.


1
Các giao thức trong Swift và Giao diện trong Java là các khái niệm giống nhau. Xem tại đây
Vivek Molkar

69
Tôi nghĩ những câu hỏi như thế này về sự khác biệt giữa các ngôn ngữ thực sự hữu ích để hiểu các tính năng ngôn ngữ. Và tôi không nghĩ rằng chúng dẫn đến những câu trả lời không cần thiết và cũng không dễ tìm ra câu trả lời trong tài liệu. Vì vậy, tôi không nghĩ rằng việc bỏ phiếu cho câu hỏi này là hợp lý.
Lii

1
Đây là một vài điểm quan trọng trong thế giới thực về giao diện Java - stackoverflow.com/a/41143492/294884 - đó sẽ là chìa khóa cho bất kỳ ai mới làm quen với Swift, dùng thử Java
Fattie

Theo một hướng khác, nó sẽ nhớ rằng toàn bộ lý do của Swift là dành cho "lập trình hướng giao thức". Bạn làm mọi thứ với "tiện ích mở rộng giao thức" trong Swift có mặt khắp nơi. Ví dụ ở đây là một vấn đề tinh tế về Swift (tức là: "về các phần mở rộng giao thức") minh họa một số vấn đề.
Fattie

2
Trong Swift, thay vì giao diện, tên giao thức được sử dụng vì trong các tệp tiêu đề Objective C (trùng lặp vô dụng) từ C được gọi là giao diện
Alex78191

Câu trả lời:


117

Về cơ bản các giao thức rất giống với các giao diện Java ngoại trừ:

  • Các giao thức Swift cũng có thể chỉ định các thuộc tính phải được thực hiện (tức là các trường)
  • Các giao thức Swift cần phải xử lý giá trị / tham chiếu thông qua việc sử dụng từ khóa đột biến (vì các giao thức có thể được thực hiện bởi các cấu trúc và các lớp)
  • bạn có thể kết hợp các giao thức tại bất kỳ điểm nào với từ khóa <> giao thức. Ví dụ: khai báo một tham số hàm phải tuân thủ giao thức A và B là:

.

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

Đây là những khác biệt rõ ràng ngay lập tức đối với một nhà phát triển Java (hoặc ít nhất là những gì tôi đã phát hiện cho đến nay).


13
" Giao thức <> keyword ": Thật tuyệt! Tôi nghĩ rằng đây là những gì được gọi là một loại giao lộ trong cộng đồng lý thuyết hệ thống loại. Tôi Java bạn chỉ có thể có các loại như vậy cho các tham số loại có nhiều giới hạn. Bài viết này đề nghị giới thiệu chúng trong Java như là loại lớp đầu tiên, với cú pháp để biểu thị chúng.
Lii

7
Tóm tắt tốt đẹp. Một vài tính năng quan trọng hơn: Các giao thức Swift cũng có thể chỉ định các yêu cầu loại liên quan, ví dụ: loại bộ sưu tập có loại chỉ mục được liên kết hoặc phương thức so sánh của loại so sánh yêu cầu tham số cùng loại. Và trong Swift 2.0, tiện ích mở rộng giao thức có thể thêm chức năng thực tế cho các loại đáp ứng yêu cầu của giao thức.
còi xương

2
@rickster Java 8 cũng có thể thêm triển khai vào giao diện bằng cách gắn thẻ một phương thức với default từ khóa . Xem Hướng dẫn của Oracle .
Basil Bourque

5
Giao thức <> từ khóa hiện đã được gỡ bỏ theo hướng có dấu và. Vì vậy, bạn có thể viết: hãy để c: A & B
Paul Robinson

2
Trong Swift, thay vì giao diện, tên giao thức được sử dụng vì trong các tệp tiêu đề Objective C (trùng lặp vô dụng) từ C được gọi là giao diện
Alex78191

33

Bổ sung cho câu trả lời của @Thomas Schar. Phép thuật giao thức Swift đến từ phần mở rộng.

  • Các giao thức Swift có thể nhận được các triển khai thông qua tiện ích mở rộng (Swift
    2). Giao diện Java 8 có thể có các triển khai mặc định, nhưng nó không thể được thực hiện "hồi tố".
  • Trong Swift, bạn có thể "hồi tố" thêm các yêu cầu giao thức (và
    các cài đặt của nó nếu cần) vào bất kỳ lớp hoặc cấu trúc nào.
  • Các giao thức Swift không tuân theo mẫu tùy chỉnh chung (tức là <..>), mà là một lược đồ typealias (tức là các loại kết hợp). Có thể gây nhầm lẫn khi bắt đầu, nhưng có thể tránh
    "mù góc khung" trong một số trường hợp.
  • Swift có kiểu khớp mẫu tiên tiến, cho phép rất cụ thể về vị trí và cách yêu cầu giao thức và tiện ích mở rộng được áp dụng. Nó có thể gây nhầm lẫn khi đến từ Java, nhưng nó có rất nhiều sức mạnh.
  • Một giao thức swift có thể được tạo cho một thuộc tính / param (tức là người kỷ niệm: giao thức)

Một điều khiến tôi phải gãi đầu trong vài giờ là không phải tất cả các giao thức đều có thể được sử dụng làm loại tài sản. Ví dụ: nếu bạn có một giao thức với typealias, bạn không thể trực tiếp sử dụng nó như một loại tài sản (nó có ý nghĩa khi bạn nghĩ về nó, nhưng đến từ Java, chúng tôi thực sự muốn có một thuộc tính như userDao: IDao).


7
Ngoài ra các giao thức Swift có thể có các thành viên tùy chọn, không giống như các giao diện Java.
eyeApps LLC

4
Một điểm nhỏ luôn xuất hiện trong Swift là, có (không có gì lố bịch) không có chức năng trừu tượng, vì vậy bạn chỉ cần "in bạn đã quên cái này!" ... stackoverflow.com/a/24111430/294884
Fattie

@Fattie. Bạn có thể sử dụng từ khóa "bắt buộc" trên một hàm để chỉ định nó yêu cầu triển khai lớp con. Vì vậy, thực sự, giống như một sự thiếu hiểu biết nhỏ hơn là một điểm thực tế.
Dirk Bester

@DirkBester - chúc mừng - chờ đã, bạn đang nói về những người khởi tạo ??
Fattie

Một lần nữa @DirkBester Tôi có thể có một số nhầm lẫn nhưng người ta không thể sử dụng requiredtrước một chức năng trong giao thức, bạn chỉ cần nhận được 'required' may only be used on 'init' declarations...
Fattie
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.