2014-09-04 22 views
12

Có thể mở rộng tất cả các đối tượng hiện có Swift như khi thêm category qua NSObject trong Mục tiêu C không?Mở rộng tất cả các đối tượng Swift

Theo article, tất cả các đối tượng Swift được kế thừa từ lớp SwiftObject, nhưng tôi không thể thêm tiện ích mở rộng vào nó.

Có giải pháp nào cho vấn đề này không?

+3

Doanh nghiệp SwiftObject đó có thể là chi tiết triển khai, nhưng các lớp Swift không kế thừa từ một lớp khác là các lớp gốc mặc định. – Atomix

Trả lời

11

Không. Các đối tượng Swift không thực sự thừa hưởng từ bất kỳ lớp cơ sở gốc nào. Trình biên dịch có thể chèn một chi tiết thực hiện, nhưng ngôn ngữ không có.

Giải pháp là hàm và thường là hàm chung, chứ không phải là phương thức. Một cái gì đó áp dụng cho "mọi loại đối tượng" không thực sự được đóng gói. Có rất ít hành động áp dụng cho mọi điều có thể tưởng tượng được trong vũ trụ. Nhưng các chức năng có thể ánh xạ hoàn toàn bất cứ điều gì để hoàn toàn bất cứ điều gì khác, do đó, là một công cụ tốt hơn ở đây.


Cũng giống như một lưu ý, không phải tất cả đối tượng kế thừa từ NSObject một trong hai, và nó không phải là một yêu cầu ngôn ngữ. Nhưng bạn đúng là đại đa số làm. Hãy xem NSProxy ở trên cùng của cây không phải là NSObject (nó triển khai giao thức NSObject, nhưng không kế thừa từ lớp NSObject). Đó là lý do tại sao id không giống như NSObject*.


Để câu hỏi của bạn về các đối tượng liên quan, điều này được built-in:

import Foundation 

class Thing { } 

let thing = Thing() 

var MyKey: Character = "0" 

objc_setAssociatedObject(thing, &MyKey, "I'm a value!", objc_AssociationPolicy(OBJC_ASSOCIATION_COPY)) 

println(objc_getAssociatedObject(thing, &MyKey)) 

Đây có phải là những gì bạn đang cố gắng để tạo ra? Lưu ý rằng objc_setAssociatedObject cũng là một hàm, không phải là một phương thức, trong ObjC.

+0

Những gì tôi định làm là thực hiện một cái gì đó tương tự như liên quan đến Object_Cject của ObjectiveC. Bất kỳ ý tưởng về làm thế nào để làm điều đó với một chức năng chung? – cfischer

+0

Bạn có thể sử dụng các đối tượng liên kết với Swift. Tại sao bạn sẽ tạo lại nó? (Câu trả lời đã được chỉnh sửa với một ví dụ) Hay bạn có ý gì đó khác? –

+0

@RobNapier: Đôi khi mọi người định nghĩa một thể loại để sử dụng các đối tượng liên quan để có thể sử dụng chúng thông qua một API phương thức bình thường thay vì phải sử dụng các hàm từ thời gian chạy. – newacct

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