Cách tắt tiếng cảnh báo nhanh chóng


98

Tôi có một đoạn mã đang tạo ra nhiều cảnh báo (API không dùng nữa)

Sử dụng tiếng kêu * Tôi có thể làm

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    ...
#pragma clang diagnostic pop

Tuy nhiên, điều này không hoạt động nhanh chóng.

Làm thế nào để làm điều đó một cách nhanh chóng?

Lưu ý: Tôi không muốn tắt cảnh báo trên toàn cầu, hoặc thậm chí trên toàn bộ tệp, mà chỉ cần tắt một cảnh báo cụ thể trong một phần cụ thể của mã nguồn của tôi.

Chỉnh sửa: Tôi có vẻ như ghi chú của tôi không đủ rõ ràng: Tôi KHÔNG muốn biên dịch có điều kiện (đó là câu trả lời được đề xuất của bản sao được cho là). Tôi chỉ muốn tắt tiếng cảnh báo KHÔNG sử dụng các API mới.



4
Đây không phải là một bản sao. Câu hỏi khác không trả lời được vấn đề này.
Claus Jørgensen,

@ ClausJørgensen mà nó không trả lời được vấn đề này theo cách nào? Không có cách nào khác như đã nêu trong các câu trả lời trong câu hỏi được liên kết. Chỉ biên dịch có điều kiện hoặc #availablemacro mới mà nhà phát triển nên sử dụng các phương pháp mới và dự phòng cho các phương thức cũ nếu không có sẵn các phương thức mới.
zrzka,

@robertvojta Không, trên thực tế, vì câu trả lời không nói rõ rằng không có cách nào khác để tắt tiếng cảnh báo.
Claus Jørgensen,

2
Đây không phải là một bản dupe. Còn về tình huống bạn nhận được cảnh báo vì thiếu trình khởi tạo thì sao?
NSTJ

Câu trả lời:


157

Kể từ năm 2020, Xcode 12.0, sự đồng thuận là không có cách nào để đạt được điều đó.

Tôi sẽ cập nhật / chỉnh sửa câu trả lời này nếu Apple thêm tính năng này.

Hãy đưa nó vào danh sách mong muốn của bạn cho WWDC 2021!


21
Chết tiệt, đó là một kẻ vô tích sự. Đôi khi nó vượt khỏi tầm tay . Thật khó chịu khi phải nói ít nhất.
Isuru

2
Tôi muốn bỏ phiếu xuống câu trả lời này một triệu lần, nhưng nó trả lời câu hỏi khá tốt nên 1 :-)
deadbeef

3
@Isuru Vào thời điểm đó, tôi đã đủ phát cáu để xây dựng lại toàn bộ. Đoán các cảnh báo đã hoạt động
Sirens

1
@Isuru Hầu hết những điều đó nên được sửa chữa, không được bỏ qua.
kevin

3
Rất bực bội! Cảm ơn vì đã cập nhật câu trả lời này.
Dan Loewenherz

48

Không có cấu trúc chung nào để tắt tiếng cảnh báo không dùng nữa trong Swift, nhưng có một cách giải quyết có thể áp dụng trong nhiều trường hợp .

Giả sử bạn có một phương thức getLatestImage()trên lớp Foosử dụng các phương thức / lớp không dùng nữa.

Sử dụng @availablenhư Daniel Thorpe đã mô tả để tắt tiếng tất cả các cảnh báo bên trong phương pháp:

@available(iOS, deprecated: 9.0)
func getLatestImage() -> UIImage? {
    ...
}

Bây giờ bạn muốn gọi phương thức getLatestImage()mà không có cảnh báo không dùng nữa. Bạn có thể đạt được điều đó bằng cách xác định trước một giao thức và một tiện ích mở rộng:

private protocol GetLatestImage {
    func getLatestImage() -> UIImage?
}
extension Foo: GetLatestImage {}

Và sau đó gọi phương thức mà không có cảnh báo không dùng nữa (nếu foolà một trường hợp của Foo):

(foo as GetLatestImage).getLatestImage() // no deprecation warning

Kết quả là bạn có mã Swift sử dụng API không dùng nữa mà không có bất kỳ cảnh báo nào về việc không dùng nữa.


Thật thông minh. Loại xấu xa? :) Nhưng quá tốt. Tuyệt vời cho một trường hợp sử dụng như ngăn chặn các cảnh báo về việc sử dụng liên tục một số khía cạnh của khung AddressBook đã không được dùng nữa, nhưng việc thay thế không thực sự cung cấp tất cả các chức năng cần thiết. Cảm ơn.
Duncan Babbage,

4
nếu điều này hiệu quả, tôi sẽ gửi cho bạn sáu gói đồ uống yêu thích của bạn. bạn có một trí tuệ xuất sắc thưa ông, cảm ơn bạn.
John

@John Cảm ơn vì những lời tốt đẹp! Nó hoạt động.
Tammo Freese

1
@John bạn đã gửi cho anh ấy gói sáu? : P Điều này thật tuyệt vời. Thiên tài. Cảm ơn.
Baran Emre,

Bạn là một thiên tài xấu xa.
Krypt

37

Trên thực tế, bạn có thể loại bỏ các cảnh báo này bằng cách sử dụng @availabletrong cấu trúc logic bao quanh (tức là hàm / loại).

Ví dụ: giả sử bạn có một số mã sử dụng khung AddressBook, nhưng bạn đang xây dựng dựa trên iOS 9.

@available(iOS, deprecated: 9.0)
func addressBookStatus() -> ABAuthorizationStatus {
    return ABAddressBookGetAuthorizationStatus()
}

Kể từ Xcode 7.0.1, điều này sẽ ngăn các cảnh báo nội tuyến được hiển thị.


6
Có, nhưng bạn sẽ thấy cảnh báo tương tự khi gọi addressBookStatus()... của bạn mà bạn đánh dấu là không dùng nữa.
Valentin Shergin

3
Mẹo chuyên nghiệp: nếu bạn muốn im lặng nó trong toàn bộ lớp học, chỉ cần ném con chó con này lên trên tuyên bố của lớp của bạn (ví dụ class ViewController: UIViewController:)
Sirens

2
@Sirens Sau đó, bạn sẽ thấy điều này cảnh báo mỗi khi bạn gọi lớp này ☹️ (ít nhất là với Xcode 8)
Alexander Vasenin

Có ai thành công trong việc tắt tiếng tất cả các cảnh báo không dùng nữa với bản sửa lỗi này không? Tôi đã có thể giảm số lượng của chúng xuống chỉ còn một , nhưng tôi không thấy cách nào để loại bỏ số cuối cùng. Bất kỳ đề xuất?
Alexander Vasenin

1
Vì vậy, làm thế nào để sử dụng điều này để tắt tiếng cảnh báo “truyền từ 'CGFloat.NativeType' (hay còn gọi là 'Double') sang loại không liên quan 'Float' luôn không thành công” khi tôi đang thực hiện if CGFloat(0).native is Float { … }? Trả lời: Tôi không sử dụng cái này vì bạn không trả lời câu hỏi.
Slipp D. Thompson

1

Mặc dù hiện tại không có cách nào để tắt các cảnh báo không dùng nữa trong Swift, nhưng về mặt kỹ thuật, bạn có thể làm điều đó cho một biểu tượng cụ thể bằng cách chỉnh sửa tệp tiêu đề.

  • Sao chép tên biểu tượng không dùng nữa
  • Chọn File>Open Quickly
  • Dán biểu tượng và nhấn Enter

    Đảm bảo rằng biểu tượng Swift bị tắt trong hộp Mở Nhanh

  • Chọn File>Show in Finder

  • Thay đổi quyền đối với tệp để cho phép chỉnh sửa nếu cần
  • Chỉnh sửa các macro không dùng nữa cho biểu tượng. Xem các API xung quanh để tham khảo. Ví dụ: thay thế:

__OSX_AVAILABLE_BUT_DEPRECATED (__ MAC_10_6, __MAC_10_10, __IPHONE_3_0, __IPHONE_8_0)

với

__OSX_AVAILABLE_STARTING (__ MAC_10_6, __IPHONE_3_0)

Bây giờ có một cảnh báo ít gây mất tập trung hơn mà bạn không thể làm gì.

Tôi biết, nó bẩn. Nhưng nếu không có sẵn API thay thế trong SDK hiện tại, thì nó sẽ an toàn. Khi phiên bản Xcode mới ra mắt, thay đổi sẽ bị ghi đè và bạn sẽ thấy lại cảnh báo. Sau đó, bạn có thể kiểm tra SDK và hệ điều hành mới để đảm bảo rằng API không dùng nữa vẫn có sẵn và không có bản thay thế.

Vui lòng bình luận nếu bạn có thể đưa ra bất kỳ nhược điểm nào.


Ủng hộ cho sự tháo vát, nhưng nó sẽ để lại vị bẩn trong miệng tôi: P
Matt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.