Cách tự phê chuẩn thành viên


168

Không giống như Objective-C, Swift không có bộ xử lý trước, vậy có còn cách nào để tự loại bỏ các thành viên của một lớp không?

Tôi đang tìm kiếm một cái gì đó tương tự như thế này:

-(id)method __deprecated;

Câu trả lời:


266

Bạn có thể sử dụng thẻ Có sẵn, ví dụ:

@available(*, deprecated)
func myFunc() { 
    // ...
}

Trong đó * là nền tảng (iOS, iOSApplicationExtension, macOS, watchOS, tvOS, * cho tất cả, v.v.).

Bạn cũng có thể xác định phiên bản của nền tảng mà từ đó nó đã introduced, deprecated, obsoleted, renamed, và message:

@available(iOS, deprecated:6.0)
func myFunc() { 
    // calling this function is deprecated on iOS6+
}

Or

@available(iOS, deprecated: 6.0, obsoleted: 7.0, message: "Because !")
func myFunc() {
    // deprecated from iOS6, and obsoleted after iOS7, the message "Because !" is displayed in XCode warnings
}

Nếu dự án của bạn nhắm mục tiêu nhiều nền tảng, bạn có thể sử dụng một số thẻ như vậy:

@available(tvOS, deprecated:9.0.1)
@available(iOS, deprecated:9.1)
@available(macOS, unavailable, message: "Unavailable on macOS")
func myFunc() {
    // ...
}

Thêm chi tiết trong tài liệu Swift .


Trong Swift 3, =s được thay thế bằng :s.
Sam Soffes

2
*, deprecated: 10.0sẽ phản đối nó cho iOS 10, tvOS 10v.v., tôi đoán chúng ta không nên kết hợp *với một số phiên bản? Bất kỳ ý tưởng về làm thế nào để làm điều đó tốt hơn?
fabb

@fabb Đây là phiên bản của ứng dụng, không phải iOS
Axel Guilmin

1
Điều đó không đúng. Từ các tài liệu bạn đã liên kết: "phiên bản của nền tảng được chỉ định"
fabb

1
Chính xác, quay trở lại điểm ban đầu của tôi: @available(*, deprecated: 10.0)do đó, đó là một ý tưởng rất tồi nên mã không chỉ chạy trên iOS
fabb

70

Bắt đầu Swift 3Swift 4 , số phiên bản là tùy chọn. Bây giờ bạn có thể chỉ cần gõ:

@available(*, deprecated)
func foo() {
    // ...
}

Hoặc nếu bạn muốn một tin nhắn đi cùng với nó:

@available(*, deprecated, message: "no longer available ...")
func foo() {
    // ...
}

1
Đối với Swift 2.3, số phiên bản cũng là tùy chọn.
DawnSong

3
Đối với Swift 2.3, cú pháp dường như là @available(*, deprecated, message = "no longer available ...")khi bao gồm một thông báo.
Daniel Zhang

@Daniel, thật kỳ lạ khi Apple thay đổi một phần của nó chứ không phải phần còn lại và gọi nó là 2.3. Đăng nhập, tôi sẽ cập nhật câu trả lời một lần nữa, cảm ơn bạn đã lưu ý!
Yuchen Zhong

6

Bạn có thể sử dụng điều này để tự động sửa lỗi bạn nhập với func mới của bạn

@available(*, deprecated, renamed: "myNewFunc")
func myOldFunc() {
   // ...
}

func myNewFunc() {
   // ...
}

Thay vì * bạn có thể sử dụng swift, cho số Phiên bản nhanh.

Các hàm không dùng nữa tạo ra các cảnh báo nhưng vẫn có thể được gọi. (Cảnh báo)

Các chức năng lỗi thời ngăn chặn nó được gọi hoàn toàn. (Lỗi)

@available(swift, deprecated: 4.0, obsoleted: 4.2, message: "This will be removed in v4.2, please migrate to ...")

hoặc sử dụng các Tùy chọn khác như iOS, macOS, watchOS, tvOS ...


1
@available(iOS, deprecated:7.0, obsoleted: <ObsoletedVersion>, renamed: "myFuncNew", message: "Please use new method - myFuncNew()")
func myFuncOld() {
    //
}

Nếu deployment target9.0

1. <ObsoletedVersion>== 10.0-warning

nhập mô tả hình ảnh ở đây

2. <ObsoletedVersion>== 8.0-compile error

nhập mô tả hình ảnh ở đây


Trong trường hợp tùy chọn "lỗi thời", không thể sử dụng nó. Theo đó, tùy chọn không được thực hiện. bug.swift.org/browse/SR-8168
mkjwa
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.