2015-06-16 24 views
82

Tôi sẽ xem hướng dẫn iOS từ Apple developer page.So sánh Giao thức trong Swift so với Giao diện trong Java

Dường như với tôi rằng và interface hầu như có cùng chức năng.

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

  • cách sử dụng khác biệt trong dự án?

Cập nhật

, tôi đã đọc các diễn đàn và tôi vẫn không chắc chắn về sự khác biệt và sử dụng giữa và interface. Khi tôi đặt câu hỏi như thế này, tôi muốn thấy 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 tất cả mọi thứ từ các tài liệu hướng dẫn.

+1

Giao thức trong Swift và Giao diện trong Java là các khái niệm tương tự. Xem [ở đây] (https://en.wikipedia.org/wiki/Protocol_ (object-oriented_programming)) –

+32

Tôi nghĩ các 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 cho việc hiểu các tính năng ngôn ngữ. Và tôi không nghĩ họ 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 những lá phiếu xuống trên câu hỏi này là hợp lý. – Lii

+0

Dưới đây là một vài ** điểm thực tế quan trọng ** về giao diện Java - http://stackoverflow.com/a/41143492/294884 - đó sẽ là chìa khóa cho bất kỳ ai ** tươi với Swift, hãy thử Java ** – Fattie

Trả lời

57

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

  • 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)
  • giao thức Swift cần để đối phó với giá trị/tài liệu tham khảo thông qua việc sử dụng của các từ khóa đột biến (vì các giao thức có thể được triển khai bởi các cấu trúc và 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 giao thức <> từ khóa. Ví dụ: khai báo thông số hàm phải tuân theo giao thức A và B là:

.

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

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

+5

"_giao thức <> keyword_": Điều đó thực sự tuyệt vời! Tôi nghĩ đây là thứ được gọi là _intersection type_ trong cộng đồng lý thuyết hệ thống kiểu. Tôi Java bạn chỉ có thể có các loại như vậy cho các tham số kiểu với nhiều giới hạn. [Bài báo này] (http://www.cs.rice.edu/~javaplt/papers/oopsla2008.pdf) đề xuất giới thiệu chúng trong Java như là loại lớp học đầu tiên, với cú pháp để biểu thị chúng. – Lii

+5

Tóm tắt hay. Một vài tính năng quan trọng khá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 liên quan hoặc phương pháp 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, các phần mở rộng giao thức có thể thêm chức năng thực tế vào các kiểu đáp ứng các yêu cầu của giao thức. – rickster

+0

@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' [keyword] (https://en.wikipedia.org/wiki/List_of_Java_keywords). Xem [Hướng dẫn Oracle] (http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html). –

20

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

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

Một điều mà tôi đã gãi đầu của tôi cho vài giờ là không phải tất cả các giao thức có thể được sử dụng như 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 kiểu thuộc tính (nó có ý nghĩa khi bạn nghĩ về nó, nhưng bắt nguồn từ Java, chúng ta thực sự muốn có một thuộc tính như userDao: IDao).

+4

Các giao thức Swift cũng có thể có các thành viên tùy chọn, không giống như các giao diện Java. –

+1

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

Các vấn đề liên quan