Cara memberhentikan anggota secara manual

168

Tidak seperti Objective-C, Swift tidak memiliki preprosesor, jadi apakah masih ada cara untuk secara manual mencela anggota kelas?

Saya mencari sesuatu yang mirip dengan ini:

-(id)method __deprecated;
Atomix
sumber

Jawaban:

266

Anda dapat menggunakan tag yang Tersedia, misalnya:

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

Di mana * adalah platform (iOS, iOSApplicationExtension, macOS, watchOS, tvOS, * untuk semua, dll.).

Anda juga dapat menentukan versi dari platform dari mana itu introduced, deprecated, obsoleted, renamed, dan 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
}

Jika proyek Anda menargetkan beberapa platform, Anda dapat menggunakan beberapa tag seperti:

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

Lebih detail dalam dokumentasi Swift .

Axel Guilmin
sumber
Dalam Swift 3, =s diganti dengan :s.
Sam Soffes
2
*, deprecated: 10.0akan mencabutnya untuk iOS 10, tvOS 10dll, saya kira kita tidak boleh menggabungkan *dengan nomor versi? Ada ide tentang bagaimana melakukannya dengan lebih baik?
Fabb
@fabb Ini adalah versi aplikasi, bukan iOS
Axel Guilmin
1
Itu tidak benar. Dari dokumen yang Anda
tautkan
1
Tepat, kembali ke titik semula: @available(*, deprecated: 10.0)oleh karena itu ide yang sangat buruk jika kode tidak hanya berjalan di iOS
fabb
70

Mulai Swift 3 dan Swift 4 , nomor versi adalah opsional. Anda sekarang dapat mengetik:

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

Atau jika Anda ingin sebuah pesan meneruskannya:

@available(*, deprecated, message: "no longer available ...")
func foo() {
    // ...
}
Yuchen Zhong
sumber
1
Untuk Swift 2.3, nomor versi juga opsional.
DawnSong
3
Untuk Swift 2.3, sintaks tampaknya @available(*, deprecated, message = "no longer available ...")ketika menyertakan pesan.
Daniel Zhang
@Aniel, itu aneh bahwa Apple mengubah bagian dari itu dan bukan sisanya dan menyebutnya 2.3. Tanda tangan, saya akan memperbarui jawabannya lagi, terima kasih atas catatannya!
Yuchen Zhong
6

Anda dapat menggunakan ini untuk memperbaiki entri Anda dengan fungsi baru Anda

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

func myNewFunc() {
   // ...
}

Alih-alih * Anda dapat menggunakan swift, untuk nomor Versi swift.

Fungsi yang tidak digunakan lagi menghasilkan peringatan tetapi masih bisa dipanggil. (Peringatan)

Fungsi usang menghentikannya dari dipanggil seluruhnya. (Kesalahan)

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

atau gunakan Pilihan lain seperti iOS, macOS, watchOS, tvOS ...

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

Jika deployment targetini 9.0dan

1. <ObsoletedVersion>== 10.0-warning

masukkan deskripsi gambar di sini

2. <ObsoletedVersion>== 8.0-compile error

masukkan deskripsi gambar di sini

yoAlex5
sumber
Dalam hal opsi "usang", tidak dapat menggunakannya. Menurut ini, opsi tidak diterapkan. bugs.swift.org/browse/SR-8168
mkjwa