2015-02-06 22 views
15

Vấn đềSwift thay thế cho #pragma kêu vang chẩn đoán

Gần đây tôi đã gặp phải một cảnh báo trong một tiện ích của bên thứ ba (WEPopover) trong đoạn mã này:

_effectivePopoverContentSize = _contentViewController.contentSizeForViewInPopover; 

này được tạo ra cảnh báo sau đây:

warning: 'contentSizeForViewInPopover' is deprecated: first deprecated in iOS 7.0 - Use UIViewController.preferredContentSize instead. [-Wdeprecated-declarations] 
      _effectivePopoverContentSize = _contentViewController.contentSizeForViewInPopover; 

Một khắc phục tạm thời cho mục đích này trong Mục tiêu-C là sử dụng chẩn đoán pragma để tắt tiếng lỗi (Tôi sẽ để các tác giả mã đối phó với một sửa chữa đúng). Vì vậy, tôi sửa đổi mã như vậy:

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wdeprecated-declarations" 
      _effectivePopoverContentSize = _contentViewController.contentSizeForViewInPopover; 

#pragma clang diagnostic pop 

Câu hỏi

nào làm việc tốt nhưng điều này dẫn tôi đến xem xét những gì nếu có thay thế tồn tại nơi người ta sẽ cần phải im lặng một cảnh báo dương tính giả tương tự như khi mã hóa trong Swift?

cân nhắc

tôi đã quan sát thực tế là tôi có thể tắt cảnh báo như vậy dự án rộng (sử dụng cài đặt Xcode) nhưng tôi muốn xem xét các vấn đề nội tuyến như đã nêu ở trên. Tôi cũng đã xem xét thêm một #define vào một tệp .bridging-header.h trong dự án Swift của tôi và bằng cách nào đó sử dụng nó; Tuy nhiên tôi đang tìm một giải pháp cụ thể Swift cho vấn đề này. Tôi hiểu rằng pragma không còn nữa và tôi đã tìm kiếm SO và tìm thấy những câu hỏi tương tự nhưng không trùng lặp.

GIẢI CẬP NHẬT: Swift 2,0

Câu trả lời cung cấp xử lý mối quan tâm của tôi về cảnh báo inline. Lệnh khả dụng sẽ cho phép tránh các vấn đề như vậy hoàn toàn vì một lệnh sẽ được cảnh báo vào thời gian biên dịch.

Swift cuốn sách của Apple dứt khoát khẳng định:

“Bạn sử dụng một điều kiện sẵn có trong một nếu hoặc bảo vệ tuyên bố có điều kiện thực thi một khối mã, tùy thuộc vào việc các API bạn muốn sử dụng được cung cấp tại thời gian chạy. Trình biên dịch sử dụng thông tin từ điều kiện sẵn có khi nó xác minh rằng các API trong đó “chặn mã có sẵn.

if #available(iOS 9, OSX 10.10, *) { 
// Use iOS 9 APIs on iOS, and use OS X v10.10 APIs on OS X 
} else { 
// Fall back to earlier iOS and OS X APIs 
} 

Trích Từ: Apple Inc.‘Ngôn ngữ lập trình Swift (Swift 2 Prerelease)’iBooks.. https://itun.es/us/k5SW7.l

Một thậm chí có thể sử dụng câu lệnh bảo vệ kết hợp với tính khả dụng để thoát khỏi phạm vi sớm trừ khi các điều kiện có sẵn được thỏa mãn.

guard #available(iOS 8.0, OSX 10.10, *) else { return } 

Trích từ: Apple Inc. “Sử dụng Swift với Cocoa và Objective-C (Swift 2 Prerelease).” IBooks.https://itun.es/us/utTW7.l

Ngoài ra, các mối quan tâm liên quan của tôi về xử lý macro được giải quyết như được ghi chú bên dưới. Hãy nhớ rằng Swift không có bộ tiền xử lý, những công cụ này có vẻ như là cách để đi.

Macros Simple

đâu bạn thường sử dụng các chỉ thị #define để xác định một hằng số nguyên thủy trong C và Objective-C, trong Swift bạn sử dụng một hằng số toàn cầu để thay thế. Ví dụ: định nghĩa không đổi #define FADE_ANIMATION_DURATION 0,35 có thể được biểu thị tốt hơn trong Swift với let FADE_ANIMATION_DURATION = 0,35. Bởi vì đơn giản macro liên tục giống như bản đồ trực tiếp đến các biến toàn cầu Swift, trình biên dịch tự động nhập khẩu các macro đơn giản quy định tại C và các tập tin nguồn C Mục tiêu “

Trích Từ: Apple Inc“. Sử dụng Swift với ca cao và Objective- C (Swift 2 Prerelease). ”IBooks. https://itun.es/us/utTW7.l

Macros Complex

macro phức tạp được sử dụng trong C và Objective-C nhưng không có đối trong Swift. Macro phức là các macro không xác định các hằng số, bao gồm các macro giống như hàm được lồng tiếng. Bạn sử dụng các macro phức hợp trong C và Objective-C để tránh các ràng buộc kiểm tra loại hoặc để tránh trả lại số lượng lớn mã soạn sẵn. Tuy nhiên, macro có thể làm cho việc sửa lỗi và tái cấu trúc khó khăn là . Trong Swift, bạn có thể sử dụng các hàm và generics để đạt được kết quả tương tự mà không có bất kỳ sự thỏa hiệp nào. Do đó, “các macro phức tạp trong nguồn C và Objective-C tệp không được cung cấp cho mã Swift của bạn.”

Trích từ: Apple Inc. “Sử dụng Swift với Cocoa và Objective-C (Swift 2 Prerelease). ”IBooks. https://itun.es/us/utTW7.l

Các nhà phát triển của API sẽ có thể đánh dấu sự sẵn có của các chức năng trong Swift sử dụng:

available(iOS 8.0, OSX 10.10, *) 
func useShinyNewFeature() { 
    // ... 
} 

Trích Từ: Apple Inc. “Sử dụng Swift với ca cao và Objective-C (Swift 2 Prerelease). ”IBooks. https://itun.es/us/utTW7.l

Việc thêm các điểm đánh dấu này vào các hàm được viết lại cho Swift có vẻ như là cách tốt để duy trì tính tương thích ngược cho Khung. Sự kết hợp bảo vệ/có sẵn sẽ cho phép người dùng các khung công tác đó điều chỉnh logic khi cần thiết. Điều khiến tâm trí của tôi thoải mái khi xử lý cả cảnh báo nội tuyến, dự phòng API và macro nói chung.

+0

Bạn có thể xem xét sử dụng một mục tiêu khung riêng biệt cho tiện ích của bên thứ ba và chỉ định cài đặt xây dựng thích hợp cho mục tiêu đó. Sau đó, trong dự án chính của bạn, bạn có thể giữ các cài đặt xây dựng phù hợp với mã của bạn. – Rob

+1

Một số thông tin cụ thể cho những người đi qua ... Tính đến 2015-05-13, Swift không hỗ trợ các macro tiền xử lý. Từ * Sử dụng Swift với Cocoa và Objective-C * (ch. Khả năng tương tác, giáo phái. Chỉ thị tiền xử lý) "Trình biên dịch Swift không bao gồm một bộ tiền xử lý. Thay vào đó, nó tận dụng các thuộc tính biên dịch, cấu hình xây dựng và các tính năng ngôn ngữ để thực hiện cùng một chức năng. Vì lý do này, các chỉ thị tiền xử lý không được nhập trong Swift. " Nó không giống như Swift sẽ bao giờ (?) Hỗ trợ các macro chẩn đoán clang và nó hiện không có bản địa thay thế được xây dựng in –

+0

@BlakeMerryman tôi đề nghị bạn thêm một câu trả lời với thông tin từ bình luận của bạn và thông báo cho OP để anh ta có thể chấp nhận nó. Vì vậy, nó không hiển thị như chưa được trả lời nữa. cổ vũ. – phlebotinum

Trả lời

2

Kể từ phiên bản 2.0 (hiện tại đang trong giai đoạn thử nghiệm), Swift vẫn không bao gồm bộ tiền xử lý và không thay đổi sớm (nếu có). Các khả năng có lợi mà tiền xử lý cho phép được xây dựng vào chính ngôn ngữ theo nhiều cách khác nhau (tôi sẽ không bao gồm tất cả chúng ở đây, xem tài liệu) và là các tính năng mức thời gian biên dịch.

Có hai tính năng mà tôi muốn đề cập đến (cũ, mới) có thể là những gì bạn đang tìm kiếm:

  1. Compilation Conditional - Như đề cập trong Using Swift with Cocoa and Objective-C, bạn có thể thực hiện điều kiện các câu lệnh biên dịch cho phép bạn chỉ biên dịch mã cho một số hệ điều hành hoặc các kiến ​​trúc xử lý nhất định. Nếu trông giống như sau:

enter image description here

  1. Kiểm tra API Availability - Như đề cập trong The Swift Programming Language, bây giờ bạn có thể kiểm tra khả dụng của API dựa trên nền tảng và hệ điều hành phiên bản. Điều này sẽ cho phép bạn tận dụng lợi thế của API mới hơn trong khi cho phép bạn xử lý khi tính năng đó không khả dụng trên nền tảng hoặc hệ điều hành cũ hơn (hoặc khác). Bạn có thể sử dụng tùy chọn này để triển khai thay thế hoặc trình bày giải thích cho người dùng. Nếu trông giống như sau:

enter image description here

Những công cụ này (cùng với nhiều người khác được xây dựng vào ngôn ngữ) nên cho phép một nhà phát triển để thay thế các macro Preprocessor Objective-C và C. Cá nhân, tôi nghĩ rằng họ là một cải tiến lớn.

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