2015-09-30 28 views
9

Tôi có một giao thức riêng định nghĩa trong một tập tin như saukiểm soát truy cập Swift trên giao thức phù hợp

private protocol testProtocol { 
func testFunc1() 
func testFunc2() 
} 

Một lớp học nào phù hợp với các giao thức trên như sau

public class testClass : testProtocol { 
func testFunc1() {} 
func testFunc2() {} 
} 

Theo tài liệu táo, các thành viên của một lớp công khai có được quyền kiểm soát truy cập nội bộ theo mặc định trừ khi nó được đặt rõ ràng thành một công cụ sửa đổi điều khiển truy cập khác.

Tài liệu cũng cho biết rằng sự phù hợp của loại đối với giao thức có kiểm soát truy cập thấp hơn sẽ làm cho việc triển khai kiểm soát truy cập giao thức của loại giống như của giao thức. Trong trường hợp này vì điều khiển truy cập của loại là công khai và điều khiển truy cập giao thức là riêng tư, các phương thức testfunc1 và testfunc2 sẽ có quyền kiểm soát truy cập riêng tư.

Khi lớp được khởi tạo trong một tập tin nguồn khác nhau và các phương pháp được truy cập như dưới đây, trình biên dịch không hiển thị một lỗi mà không được mong đợi như các phương pháp nên tin theo hướng dẫn

var test: testClass = testClass() 
test.testFunc1() 

Đây có phải là hành vi mong đợi không? Tui bỏ lỡ điều gì vậy?

+0

Bạn đã tìm thấy một số giải pháp chưa? – ZevsVU

Trả lời

4

Apple Documentation nói:

When you write or extend a type to conform to a protocol, you must ensure that the type’s implementation of each protocol requirement has at least the same access level as the type’s conformance to that protocol.

Theo này tôi cho rằng phương pháp thực hiện testFunc1 và testFunc2 với một modifier kiểm soát truy cập bên trong TestClass chỉ ghi đè mà từ giao thức. Nếu bạn sử dụng thực hiện giao thức mặc định của phương pháp này như trình biên dịch sau đây sẽ trả về lỗi:

extension testProtocol { 
    func testFunc1() {} 
    func testFunc2() {} 
} 

As far as Swift là Nghị định thư Oriented Language với thay thế kế thừa với các giao thức đó có thể là hợp lý nếu bạn muốn thay đổi giao thức định cấp độ truy cập của bên trong lớp tùy chỉnh của bạn.

0

Theo tài liệu của Apple:

When you write or extend a type to conform to a protocol, you must ensure that > the type’s implementation of each protocol requirement has at least the same > access level as the type’s conformance to that protocol.

Xin lưu ý của "ít nhất" trong doc, nó có nghĩa là chừng nào mức độ truy cập thực hiện của loại các yêu cầu giao thức là cao hơn hoặc bằng cấp truy cập của giao thức, nó sẽ ổn. Trong trường hợp của bạn, testFunc1 và testFunc2 từ testClass có mức truy cập mặc định nội bộ, nó cao hơn mức truy cập riêng tư. Vì vậy, thực tế hai phương thức trong testClass có được mức truy cập nội bộ, và trình biên dịch sẽ không coi nó là lỗi vi.

Chúng tôi có thể thay đổi mã của bạn một chút như sau:

fileprivate protocol TestProtocol { 
    func testFunc1() 
    func testFunc2() 
} 

public class TestClass : TestProtocol { 
    public func testFunc1() {} 
    public func testFunc2() {} 

}

Đoạn mã này cũng sẽ biên dịch mà không có lỗi.

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