Từ khóa 'mở' trong Swift là gì?


333

Các ObjectiveC.swifttập tin từ thư viện chuẩn chứa một vài dòng mã sau đây xung quanh dòng 228:

extension NSObject : Equatable, Hashable {
  /// ...
  open var hashValue: Int {
    return hash
  }
}

Điều này open varcó nghĩa gì trong bối cảnh này, hoặc opentừ khóa nói chung là gì?


2
Có thể liên quan: stackoverflow.com/questions/24003918/ ((Sự khác biệt giữa openpublic? ")
Ahmad F

Lưu ý bên lề: từ khóa
Mu

Câu trả lời:


571

open là cấp độ truy cập mới trong Swift 3, được giới thiệu với việc triển khai

Nó có sẵn với ảnh chụp nhanh Swift 3 từ ngày 7 tháng 8 năm 2016 và với Xcode 8 beta 6.

Nói ngắn gọn:

  • Một openlớp có thể truy cậpphân lớp bên ngoài mô đun xác định. Một openthành viên lớp có thể truy cậpoverridable bên ngoài mô đun xác định.
  • Một publiclớp có thể truy cập nhưng không thể phân lớp bên ngoài mô đun xác định. Một publicthành viên lớp có thể truy cập nhưng không thể ghi đè bên ngoài mô đun xác định.

Vì vậy, opennhững gì đã publictừng là trong các bản phát hành Swift trước đây và quyền truy cập publicđã bị hạn chế. Hoặc, như Chris Lattner đặt nó trong SE-0177: Cho phép phân biệt giữa truy cập công cộng và tính quá mức công khai :

Hiện tại, người dùng đã mở ra một cách đơn giản, công khai hơn so với cộng đồng, cung cấp một mô hình rất đơn giản và gọn gàng.

Trong ví dụ của bạn, open var hashValuelà một thuộc tính có thể truy cập và có thể được ghi đè trong các NSObjectlớp con.

Để biết thêm ví dụ và chi tiết, hãy xem SE-0117 .


16
Vậy publictrong Swift 3 giống như public finaltrong Swift 2, và openlà như thế publicnào?
Clashsoft

16
@Clashsoft: "open" trong Swift 3 giống như "công khai" trong Swift 2. "công khai" trong Swift 3 không có tương đương trong Swift 2. (Một lớp cuối cùng hoàn toàn không thể được phân lớp, ngay cả trong cùng một mô-đun.)
Martin R

59
Đó là vui nhộn phản trực giác. Cảm ơn đã tóm tắt.
GoldenJoe

7
Đồng ý với @MikeS và việc không có khả năng tương thích ngược khiến điều này trở thành một mớ hỗn độn khủng khiếp.
HughHughTeotl

14
@MikeS apple - nghĩ khác, ngay cả khi nó không cần thiết.
Varun Nath

12

Đọc mở như

mở để kế thừa trong các mô-đun khác

Tôi lặp lại mở để kế thừa trong các mô-đun khác. Vì vậy, một lớp mở được mở để phân lớp trong các mô đun khác bao gồm mô đun xác định. Vars mở và các chức năng được mở để ghi đè trong các mô-đun khác. Mức độ truy cập hạn chế ít nhất của nó. Nó cũng tốt như truy cập công cộng chấp nhận rằng một cái gì đó là công khai được đóng lại để kế thừa trong các mô-đun khác.

Từ Apple Docs :

Truy cập mở chỉ áp dụng cho các lớp và thành viên lớp và nó khác với truy cập công khai như sau:

  1. Các lớp có quyền truy cập công cộng hoặc bất kỳ cấp truy cập hạn chế nào khác chỉ có thể được phân lớp trong mô-đun nơi chúng được xác định.

  2. Các thành viên lớp có quyền truy cập công khai hoặc bất kỳ cấp truy cập hạn chế nào khác, chỉ có thể bị ghi đè bởi các lớp con trong mô-đun nơi chúng được xác định.

  3. Các lớp mở có thể được phân lớp trong mô-đun nơi chúng được xác định và trong bất kỳ mô-đun nào nhập mô-đun nơi chúng được xác định.

  4. Các thành viên của lớp mở có thể bị ghi đè bởi các lớp con trong mô-đun nơi chúng được xác định và trong bất kỳ mô-đun nào nhập mô-đun nơi chúng được xác định.

5

Mở là một cấp độ truy cập, được giới thiệu để áp đặt các giới hạn đối với kế thừa lớp trên Swift.

Điều này có nghĩa là mức truy cập mở chỉ có thể được áp dụng cho các lớp và thành viên lớp .

Trong các lớp học

Một lớp mở có thể được phân lớp trong mô-đun, nó được định nghĩa trong và trong các mô-đun nhập mô-đun trong đó lớp được xác định.

Trong lớp

Điều tương tự áp dụng cho các thành viên lớp. Một phương thức mở có thể được ghi đè bởi các lớp con trong mô-đun, nó được định nghĩa trong và trong các mô-đun nhập mô-đun trong đó phương thức được xác định.

NHU CẦU CẬP NHẬT NÀY

Một số lớp của thư viện và khung không được thiết kế để được phân lớp và làm như vậy có thể dẫn đến hành vi không mong muốn. Thư viện Apple bản địa cũng sẽ không cho phép ghi đè các phương thức và lớp tương tự,

Vì vậy, sau khi bổ sung, họ sẽ áp dụng các cấp truy cập công cộng và riêng tư cho phù hợp.

Để biết thêm chi tiết, hãy xem Tài liệu của Apple về Kiểm soát truy cập


1

Ngoại trừ lớp con, một open class funccũng có thể truy cập từ bất cứ nơi nào trong dự án của bạn. Giả sử bạn đang định nghĩa một hàm lớp mở trong lớp Util của bạn như thế này

open class Utils: NSObject {
    open class func printHello() {
        print("Hello from utils")
    }
}

Sau đó, ở bất cứ nơi nào trong bộ điều khiển xem của bạn, bạn chỉ cần truy cập phương thức này bằng cách gọi

Utils.printHello()

3
Câu trả lời này không giải thích nó khác với công chúng như thế nào vì bạn cũng có thể làm điều đó với công chúng.
Jose Ramirez

Cần giải thích thêm về nó
MD Aslam Ansari

1

mở đến để chơi khi giao dịch với nhiều mô-đun.

lớp mở có thể truy cập và phân lớp bên ngoài mô đun xác định. Một thành viên lớp mở có thể truy cập và ghi đè bên ngoài mô đun xác định.


0

mở chỉ dành cho một mô-đun khác, ví dụ: vỏ ca cao hoặc kiểm tra đơn vị, chúng ta có thể kế thừa hoặc ghi đè

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.