2016-09-26 25 views
10

Tôi có một danh mục Obj-C trên NSDate và tôi đang cố gắng sử dụng các chức năng trong danh mục đó với cấu trúc Ngày của Swift.Sử dụng danh mục NSDate với Swift 3 Loại ngày

Có cách nào để làm điều đó mà không phải bỏ qua mỗi lần hoặc phải tạo NSDate phiên bản từ Date hoặc một số lỗi khác xấu xí khác?

Hoặc tôi có bị kẹt khi phải định nghĩa đối tượng của mình là NSDate thay vì Ngày không?

của Apple đề cập here rằng

Lớp phủ Swift để khuôn khổ Foundation cung cấp cấu trúc Date, mà cầu đến lớp NSDate. Loại giá trị ngày cung cấp chức năng tương tự như kiểu tham chiếu NSDate, và cả hai có thể được sử dụng thay thế cho nhau trong mã Swift tương tác với các API mục tiêu-C. Hành vi này tương tự như cách Swift cầu chuỗi tiêu chuẩn, số và các loại bộ sưu tập cho các lớp Foundation tương ứng của chúng.

, vì vậy câu hỏi của tôi là làm cách nào để truy cập các chức năng bổ sung trong danh mục NSDate của tôi với các đối tượng có mã số tối thiểu trong sạch?

Để tham khảo, tôi đang sử dụng Swift 3.

+1

Để sử dụng danh mục 'NSDate' Mục tiêu-C đó, bạn phải đưa đối tượng' Date' vào 'NSDate'. Hoặc bạn có thể viết lại category của bạn như là một Swift 'extension' thành' Date'. – Rob

Trả lời

5

Các loại cầu nối 3 của Swift được thực hiện thông qua tham chiếu bên trong đối tượng tương ứng Objective-C của chúng. Vì vậy, tương tự như nguyên tắc "thành phần thừa kế", bạn có thể khai báo các phương thức mà bạn quan tâm, trong Swift và chỉ cần chuyển tiếp cuộc gọi.

Ví dụ, nếu bạn có các phương pháp sau đây trong Objective-C:

@interface NSDate(MyAdditions) 
- (NSString*)myCustomNicellyFormattedDate; 
@end 

bạn có thể thêm một phần mở rộng để Date mà chỉ đơn giản phôi và chuyển tiếp:

extension Date { 
    var myCustomNicellyFormattedDate: String { 
     return (self as NSDate).myCustomNicellyFormattedDate() 
    } 
} 

Cách tiếp cận này có lợi thế có phương pháp có sẵn trong cả Objective-C và Swift, với ít rắc rối trên không và bảo trì. Và quan trọng nhất, không cần sao chép mã.

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