TL; DR
popViewController(animated:)
kembali UIViewController?
, dan kompilator memberikan peringatan itu karena Anda tidak menangkap nilainya. Solusinya adalah dengan menetapkannya ke garis bawah:
_ = navigationController?.popViewController(animated: true)
Swift 3 Perubahan
Sebelum Swift 3, semua metode memiliki "hasil yang dapat dibuang" secara default. Tidak ada peringatan yang akan terjadi jika Anda tidak menangkap apa yang dikembalikan metode tersebut.
Untuk memberi tahu compiler bahwa hasilnya harus diambil, Anda harus menambahkan @warn_unused_result
sebelum deklarasi metode. Ini akan digunakan untuk metode yang memiliki bentuk yang bisa berubah (mis. sort
Dan sortInPlace
). Anda akan menambahkan @warn_unused_result(mutable_variant="mutableMethodHere")
untuk memberi tahu kompilernya.
Namun, dengan Swift 3, perilakunya terbalik. Semua metode sekarang memperingatkan bahwa nilai yang dikembalikan tidak ditangkap. Jika Anda ingin memberi tahu compiler bahwa peringatan tersebut tidak diperlukan, Anda menambahkan @discardableResult
sebelum deklarasi metode.
Jika Anda tidak ingin menggunakan nilai yang dikembalikan, Anda harus memberi tahu compiler secara eksplisit dengan menetapkannya ke garis bawah:
_ = someMethodThatReturnsSomething()
Motivasi untuk menambahkan ini ke Swift 3:
- Pencegahan kemungkinan bug (mis. Menggunakan
sort
pemikiran itu memodifikasi koleksi)
- Maksud eksplisit untuk tidak menangkap atau perlu menangkap hasil untuk kolaborator lain
UIKit API tampaknya tertinggal dalam hal ini, tidak menambahkan @discardableResult
untuk penggunaan normal sempurna (jika tidak lebih umum) popViewController(animated:)
tanpa menangkap nilai yang dikembalikan.
Baca lebih banyak
let
: Anda bisa menetapkan ke _ tanpa mendahului denganlet
atauvar
.@discardableResult
) untuk fungsi yang mengembalikan nilai tetapi diharapkan seseorang dapat mengabaikan nilai yang dikembalikan. UIKit belum menerapkan anotasi itu ke API mereka.Saat kehidupan memberi Anda lemon, buat perpanjangan:
import UIKit extension UINavigationController { func pop(animated: Bool) { _ = self.popViewController(animated: animated) } func popToRoot(animated: Bool) { _ = self.popToRootViewController(animated: animated) } }
Perhatikan bahwa menambahkan sesuatu seperti
@discardableResult func pop(animated: Bool) -> UIViewController?
akan menghasilkan peringatan yang sama dengan yang Anda coba hindari.Dengan ekstensi sekarang Anda dapat menulis:
func exitViewController() { navigationController?.pop(animated: true) } func popToTheRootOfNav() { navigationController?.popToRoot(animated: true) }
Edit: Menambahkan popToRoot juga.
sumber
Di Swift 3, mengabaikan nilai kembalian dari suatu fungsi yang memiliki nilai kembalian yang dideklarasikan akan menghasilkan peringatan.
Salah satu cara untuk menyisih dari ini adalah menandai fungsi dengan
@discardableResult
atribut. Karena Anda tidak memiliki kendali atas fungsi ini, itu tidak akan berhasil.Metode lain untuk menghilangkan peringatan adalah dengan menetapkan nilainya
_
. Ini memberi tahu kompiler bahwa Anda tahu metode tersebut mengembalikan nilai tetapi Anda tidak ingin menyimpannya dalam memori.let _ = navigationController?.popViewController(animated: true)
sumber
_
sampai Apple memperbarui UIKit dengan atribut baru ini.@discardableResult
tidak berhasil (setidaknya masih serak dengan 8b4). Friedrich Schiller menyukai apel busuk. Mungkin masalah selera :-(Meskipun itu
work correctly if kept as it is
tapinumber of warning increases.
Solusinya adalah dengan sederhana
replace it with underscore ( _ )
meskipun tampaknya jelek.Eg. _ = navigationController?.popViewController(animated: true)
sumber
Gunakan discardableResult dalam kondisi ini.
Menurut <Swift Programming Language>, bab Referensi Bahasa - Atribut.
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Attributes.html#//apple_ref/doc/uid/TP40014097-CH35-ID347
Ada juga demo dalam <Swift Programming Language>, bab Panduan Bahasa - Metode.
@discardableResult mutating func advance(to level: Int) -> Bool { ... return true }
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Methods.html#//apple_ref/doc/uid/TP40014097-CH15-ID234
sumber
Jika Anda ingin menggunakan ekstensi seperti jawaban CodeReaper, Anda harus menggunakan
@descardableResult
. Ini menyimpan semua kemungkinan, tetapi membungkam peringatan.import UIKit extension UINavigationController { @discardableResult func pop(animated: Bool) -> UIViewController? { return self.popViewController(animated: animated) } @discardableResult func popToRoot(animated: Bool) -> [UIViewController]? { return self.popToRootViewController(animated: animated) } }
sumber
Cara lain adalah Anda dapat membuka bungkus
self.navigationController?
nilai dan memanggilpopViewController
fungsinya.if let navigationController = navigationController { navigationController.popViewController(animated: true) }
sumber