Trong mục tiêu-C, tôi đã tạo một thể loại rất tiện dụng (một phần mở rộng, theo thuật ngữ Swift) của NSObject
thêm khả năng thêm cặp khóa/giá trị tùy ý vào bất kỳ NSObject
nào khi chạy. Nó sử dụng các đối tượng liên kết để đính kèm một từ điển có thể thay đổi cho đối tượng, và sau đó cung cấp các phương thức get và set nhận/đặt các cặp khóa/giá trị vào/từ từ điển đó. Nó chỉ là một vài dòng mã.Có cách nào để thêm tiện ích mở rộng vào AnyObject không?
Điều này làm cho nó có thể đính kèm cặp khóa/giá trị tùy ý vào bất kỳ đối tượng nào khi chạy, bao gồm các đối tượng được tạo bởi hệ thống. Đó là chìa khóa. Có những trường hợp khung hệ thống trả về một đối tượng cho bạn và bạn cần có khả năng đính kèm một giá trị cho nó.
Thủ thuật này cũng giúp tạo các danh mục có các biến mẫu mới. (. Ok, họ không thực sự, nhưng đối với nó cho phép bạn thêm các biến trạng thái mới để các đối tượng trong một thể loại)
này là không thể trong Swift 1.2 vì:
- Swift không có một lớp cơ sở cho tất cả các đối tượng như NSObject trong Mục tiêu-C. Nó sử dụng AnyObject, là một giao thức.
- Swift 1.2 không cho phép tiện ích mở rộng giao thức.
Tôi phải từ bỏ điều này trong Swift 1.2.
Nhưng Swift 2 cho phép tiện ích mở rộng giao thức. Tôi nghĩ "Tuyệt vời, bây giờ tôi có thể thêm phần mở rộng của tôi cho phép tôi thêm cặp khóa/giá trị vào AnyObject!"
Không có niềm vui.
Khi tôi cố gắng tạo ra phần mở rộng của tôi cho AnyObject:
extension AnyObject: AssociatedObjectProtocol
Tôi nhận được thông báo lỗi
Protocol 'AnyObject' không thể được mở rộng
Arghh! Rất gần, nhưng không. Có vẻ như ngôn ngữ này cấm hoàn toàn việc mở rộng AnyObject. Tại sao điều này, và có cách nào xung quanh nó?
Tôi không sử dụng danh mục của mình trên NSObject thường xuyên, nhưng khi tôi làm, đó là một phao cứu sinh. Tôi muốn thêm nó vào túi thủ thuật của tôi trong Swift.
Tôi có thể thêm nó vào NSObject giống như tôi làm trong Objective-C, nhưng điều đó có nghĩa là nó chỉ hoạt động cho các đối tượng kế thừa từ NSObject - làm cho nó không hoạt động cho các lớp Swift gốc.
Ghi chú ngẫu nhiên: Tôi không nghĩ bạn muốn giao thức bắt đầu bằng chữ thường. https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingBasics.html#//apple_ref/doc/uid/20001281-1002242-BBCIJGDB –