2014-08-29 17 views
21

Trong Swift, không cần thiết phải prefix classes nữa vì mô-đun của chúng hoạt động như không gian tên.Chức năng mở rộng tiền tố

Điều gì về chức năng mở rộng tiền tố? Ví dụ:

extension UIImage { 

    public func hnk_hasAlpha() -> Bool { ... } 

} 

Một mặt Swift không động nên va chạm sẽ tạo ra lỗi trình biên dịch.

Nhưng điều gì sẽ xảy ra nếu mã được biên dịch chạy trong phiên bản iOS/OS X trong tương lai mà một trong các phương pháp mở rộng của tôi được thêm vào? Các phương thức trong các mô-đun khác nhau có được coi là các biểu tượng khác nhau ngay cả khi chúng có cùng chữ ký không?

Có tạo sự khác biệt nếu lớp mở rộng là lớp con NSObject hoặc lớp Swift thuần túy không?

+0

Tại sao bạn cho rằng nên thêm chức năng vào lớp được Apple cung cấp? Tại sao không chỉ viết một hàm. Điều đó sẽ rõ ràng đối với các nhà phát triển tương lai làm việc với mã. Hoặc phân lớp. – zaph

+12

Cho dù đó là ý hay hay không liên quan đến khía cạnh kỹ thuật của câu hỏi, thì Swift xử lý loại va chạm này như thế nào. Điều đó nói rằng, tôi nghĩ rằng việc mở rộng các lớp của Apple rất hữu ích để cung cấp cho các chức năng ngữ cảnh tốt hơn trong khi giới hạn phạm vi của biểu tượng, và thực hiện các giao thức tùy chỉnh mà không cần đến các đối tượng bao bọc, trong số những thứ khác. – hpique

Trả lời

20

Có một số sự tinh tế ở đây:

mở rộng các loại Mục tiêu-C được thực hiện dưới dạng danh mục C, với tất cả điều đó ngụ ý. Tuy nhiên,

tiện ích mở rộng của loại Swift chỉ có hiệu lực khi hiển thị do nhập. Điều này có nghĩa là bạn không thể vô tình dẫm lên một phương pháp hệ thống riêng (cho dù bây giờ hoặc một được giới thiệu trong tương lai), và nếu hệ thống giới thiệu một phương thức công cộng có cùng tên với tên của bạn, bạn sẽ bị lỗi khi biên dịch bạn xây dựng lại, nhưng ứng dụng hiện tại của bạn sẽ không bị hỏng.

+0

Cảm ơn. Bạn có nguồn không? – hpique

+2

Đừng nhớ, tbh. Một số kết hợp của các diễn đàn dev và nói chuyện với những người làm việc trên nhanh chóng. –

+0

@hpique Kiểm tra tài liệu này: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html#//apple_ref/doc/uid/TP40014216-CH4-ID35 section ' Tiện ích mở rộng '. Tuyên bố cuối cùng tuyên bố 'Bạn không thể sử dụng phần mở rộng để ghi đè các phương thức hoặc thuộc tính hiện có trên các loại Mục tiêu-C'. Trình biên dịch trả về lỗi nếu tìm thấy chữ ký xung đột. – lukewar

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