วิธีเลิกสมาชิกด้วยตนเอง


168

แตกต่างจาก Objective-C Swift ไม่มีตัวประมวลผลล่วงหน้าดังนั้นยังมีวิธีที่จะเลิกสมาชิกของคลาสด้วยตนเองหรือไม่?

ฉันกำลังมองหาบางอย่างที่คล้ายกับนี้:

-(id)method __deprecated;

คำตอบ:


266

คุณสามารถใช้แท็กที่มีอยู่ตัวอย่างเช่น:

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

โดยที่ * เป็นแพลตฟอร์ม (iOS, iOSApplicationExtension, macOS, watchOS, tvOS, * สำหรับทุกคน ฯลฯ )

นอกจากนี้คุณยังสามารถระบุรุ่นของแพลตฟอร์มจากการที่มันเป็นintroduced, deprecated, obsoleted, renamedและ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
}

หากโครงการของคุณกำหนดเป้าหมายหลายแพลตฟอร์มคุณสามารถใช้หลายแท็กดังนี้:

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

รายละเอียดเพิ่มเติมในเอกสารสวิฟท์


ใน Swift 3 =s จะถูกแทนที่ด้วย:s
Sam Soffes

2
*, deprecated: 10.0จะเลิกใช้มันสำหรับiOS 10, tvOS 10ฯลฯ ผมคิดว่าเราไม่ควรรวม*กับหมายเลขรุ่น? ความคิดใด ๆ เกี่ยวกับวิธีการทำดีกว่า?
fabb

@fabb มันเป็นเวอร์ชั่นของแอพไม่ใช่ iOS
Axel Guilmin

1
นั่นไม่เป็นความจริง จากเอกสารที่คุณเชื่อมโยง: "เวอร์ชั่นของแพลตฟอร์มที่ระบุ"
fabb

1
ว่ากลับมาที่จุดเดิมของฉัน: @available(*, deprecated: 10.0)ดังนั้นจึงเป็นความคิดที่ดีมากควรรหัสไม่ได้ทำงานเฉพาะบน iOS
FABB

70

เริ่มต้นSwift 3และSwift 4หมายเลขเวอร์ชันเป็นทางเลือก ตอนนี้คุณสามารถพิมพ์:

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

หรือถ้าคุณต้องการข้อความไปด้วย:

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

1
สำหรับ Swift 2.3 จะมีหมายเลขรุ่นด้วยเช่นกัน
DawnSong

3
สำหรับ Swift 2.3 ดูเหมือนว่าไวยากรณ์จะ@available(*, deprecated, message = "no longer available ...")รวมอยู่เมื่อรวมข้อความ
Daniel Zhang

@Daniel มันแปลกที่ Apple เปลี่ยนส่วนหนึ่งไม่ใช่ที่เหลือและเรียกมันว่า 2.3 ลงชื่อเข้าใช้ฉันจะอัปเดตคำตอบอีกครั้งขอบคุณสำหรับหมายเหตุ!
Yuchen Zhong

6

คุณสามารถใช้สิ่งนี้เพื่อแก้ไขรายการของคุณด้วย func ใหม่โดยอัตโนมัติ

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

func myNewFunc() {
   // ...
}

แทนที่จะเป็น * คุณสามารถใช้ swift สำหรับหมายเลขเวอร์ชัน swift

ฟังก์ชันที่เลิกใช้แล้วจะสร้างคำเตือน แต่ยังสามารถเรียกใช้ได้ (คำเตือน)

ฟังก์ชั่นที่ล้าสมัยจะหยุดไม่ให้ถูกเรียกอย่างสมบูรณ์ (ข้อผิดพลาด)

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

หรือใช้ตัวเลือกอื่น ๆ เช่น iOS, macOS, watchOS, tvOS ...


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

ถ้าdeployment targetเป็น9.0และ

1. <ObsoletedVersion>== 10.0-warning

ป้อนคำอธิบายรูปภาพที่นี่

2. <ObsoletedVersion>== 8.0-compile error

ป้อนคำอธิบายรูปภาพที่นี่


ในกรณีที่ตัวเลือก "ล้าสมัย" ไม่สามารถใช้งานได้ ตามนี้ตัวเลือกไม่ได้ดำเนินการ bugs.swift.org/browse/SR-8168
mkjwa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.