私は以前きれいにコンパイルしたがXcode 8で警告を生成する次の関数を持っています。
func exitViewController()
{
navigationController?.popViewController(animated: true)
}
「UIViewController?型の式は未使用です」.
それはなぜこれを言っているのでしょうか、そしてそれを取り除く方法はありますか?
コードは期待どおりに実行されます。
popViewController(animated:)
はUIViewController?
を返します、そして、あなたが値を捕らえていないので、コンパイラはその警告を出しています。解決策はそれをアンダースコアに割り当てることです。
_ = navigationController?.popViewController(animated: true)
Swift 3より前のバージョンでは、デフォルトですべてのメソッドに「破棄可能な結果」がありました。メソッドから返されたものをキャプチャしなかった場合、警告は発生しません。
結果をキャプチャする必要があることをコンパイラに伝えるには、メソッド宣言の前に@warn_unused_result
を追加する必要がありました。変更可能な形式を持つメソッド(例えばsort
やsortInPlace
)に使用されます。コンパイラに伝えるために@warn_unused_result(mutable_variant="mutableMethodHere")
を追加します。
ただし、Swift 3では、動作が反転しています。すべてのメソッドは戻り値がキャプチャされていないことを警告するようになりました。警告が不要であることをコンパイラに伝えたい場合は、メソッド宣言の前に@discardableResult
を追加します。
戻り値を使用したくない場合は、を明示的にアンダースコアに割り当ててコンパイラに通知する必要があります。
_ = someMethodThatReturnsSomething()
これをSwift 3に追加する動機:
sort
を使用)UIKit APIはこれに遅れをとっているように見えます。戻り値をとらえずにpopViewController(animated:)
を完全に通常の(もっと一般的ではないにしても)使用するために@discardableResult
を追加しないようにします。
人生があなたにレモンを与えるとき、延長をしなさい:
import UIKit
extension UINavigationController {
func pop(animated: Bool) {
_ = self.popViewController(animated: animated)
}
func popToRoot(animated: Bool) {
_ = self.popToRootViewController(animated: animated)
}
}
@discardableResult func pop(animated: Bool) -> UIViewController?
のようなものを追加すると、回避しようとしているのと同じ警告が表示されることに注意してください。
拡張子を使えば、今書くことができます:
func exitViewController()
{
navigationController?.pop(animated: true)
}
func popToTheRootOfNav() {
navigationController?.popToRoot(animated: true)
}
編集:popToRootも追加しました。
Swift 3では、宣言された戻り値を持つ関数の戻り値を無視すると警告が発生します。
これをオプトアウトする1つの方法は、関数に@discardableResult
属性を付けることです。この機能を制御することはできないので、それは機能しません。
警告を取り除くもう1つの方法は、値を_
に割り当てることです。これは、メソッドが値を返すことを知っているが、それをメモリに保持したくないということをコンパイラに知らせます。
let _ = navigationController?.popViewController(animated: true)
つかいます discardableResult この状態で。
<Swift Programming Language>の「言語リファレンス - 属性」の章に従ってください。
discardableResult
値を返す関数またはメソッドが結果を使用せずに呼び出されたときにコンパイラの警告を表示しないようにするには、この属性を関数またはメソッドの宣言に適用します。
<Swift Programming Language>のLanguage Guide - Methodsの章にもデモがあります。
@discardableResult
mutating func advance(to level: Int) -> Bool {
...
return true
}
戻り値を無視するためにadvance(to :)メソッドを呼び出すコードは必ずしも間違いではないため、この関数は@discardableResult属性でマークされています。この属性について詳しくは、属性を参照してください。
CodeReaperの答えのような拡張機能の道を歩みたい場合は、@descardableResult
を使うべきです。これはすべての可能性を保ちますが、警告を黙らせます。
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)
}
}