2016-03-17 20 views
9

Tôi muốn tổ một giao thức trong lớp học của tôi để thực hiện mô hình đại biểu như vậy:giao thức Swift lồng nhau trong một lớp học

class MyViewController : UIViewController { 

    protocol Delegate { 
     func eventHappened() 
    } 

    var delegate:MyViewController.Delegate? 

    private func myFunc() { 
     delegate?.eventHappened() 
    } 
} 

Nhưng trình biên dịch sẽ không cho phép nó:

Tuyên bố là chỉ hợp lệ ở phạm vi tệp

Tôi có thể dễ dàng làm cho nó hoạt động bằng cách tuyên bố MyViewControllerDelegate ngoài phạm vi lớp học.
Câu hỏi của tôi là lý do tại sao giới hạn như vậy?

Trả lời

9

theo swift documenation

Swift cho phép bạn xác định các loại lồng nhau, nhờ đó mà bạn tổ hỗ trợ kiểu liệt kê, các lớp học, và cấu trúc bên trong định nghĩa của các loại họ hỗ trợ.

Giao thức đã cho không nằm trong danh sách đó, có vẻ như giao thức hiện không được hỗ trợ. Có thể họ sẽ thêm tính năng này vào một thời điểm nào đó (Swift đã được thông báo sau chưa đầy 2 năm). Bất kỳ ý tưởng về lý do tại sao họ sẽ không hoặc sẽ không được đầu cơ về phía tôi.

-3

Một vấn đề riêng với lớp học của bạn là delegate không có loại cụ thể. Bạn có thể lấy đi với tuyên bố nó là MyViewController.Delegate? vì nó là một loại tùy chọn và có thể là .None. Nhưng điều đó chỉ làm cho mã số riêng myFunc chết của bạn. Chỉ các bảng liệt kê, lớp học và cấu trúc mới có thể tuân thủ đối với giao thức. Loại nào trong số ba loại này là delegate?

Điều đó nói rằng, đây không phải là nguyên nhân gây ra sự cố của bạn. Khi tôi tạo một loại thực cho delegate và làm cho nó phù hợp với giao thức Delegate, tôi vẫn gặp lỗi tương tự.

class MyViewController: UIViewController { 

    protocol Delegate { 
    func eventHappened() 
    } 

    class Classy: Delegate { 
    func eventHappened() { 
     print("eventHappened") 
    } 
    } 

    var delegate: Classy? = Classy() 

    func myFunc() { 
    delegate?.eventHappened() 
    } 
} 

enter image description here

Như một bài tập bí truyền này có thể là thú vị trong việc thúc đẩy các giới hạn của những gì một lớp có thể làm nhưng không ai từng phải cố gắng để khai báo một giao thức bên trong của một lớp. Giao thức là tất cả về thành phần loại và bộ sưu tập. Không có kịch bản sử dụng lại mã khi bạn bị giới hạn ở cùng lớp bên ngoài.

+0

Giao thức ủy quyền được dự định sẽ được thực hiện bởi người dùng của lớp này. Những gì bạn mô tả như là một vấn đề không phải là một vấn đề - đó là một mẫu thiết kế phần mềm thiết yếu được sử dụng trong suốt các khuôn khổ Cocoa & CocoaTouch của Apple. –

+0

Bạn có thể xem tổng quan đầy đủ về cách các đại biểu được sử dụng trong Cocoa _ (và mở rộng, Objective-C & Swift, vì trước đây được thiết kế song song với Cocoa và sau đó chủ yếu cho các ứng dụng Cocoa) _ trong Apple [ Hướng dẫn về năng lực cốt lõi của Cocoa, phần Ủy quyền] (https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html#//apple_ref/doc/uid/TP40008195-CH14-SW1). –

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