web-dev-qa-db-ja.com

Xcode 8 / Swift 3:「UIViewController型の式は使用されていません」という警告

私は以前きれいにコンパイルしたがXcode 8で警告を生成する次の関数を持っています。

func exitViewController()
{
    navigationController?.popViewController(animated: true)
}

「UIViewController?型の式は未使用です」.

それはなぜこれを言っているのでしょうか、そしてそれを取り除く方法はありますか?

コードは期待どおりに実行されます。

228
Gruntcakes

TL、DR

popViewController(animated:)UIViewController?を返します、そして、あなたが値を捕らえていないので、コンパイラはその警告を出しています。解決策はそれをアンダースコアに割り当てることです。

_ = navigationController?.popViewController(animated: true)

スイフト3チェンジ

Swift 3より前のバージョンでは、デフォルトですべてのメソッドに「破棄可能な結果」がありました。メソッドから返されたものをキャプチャしなかった場合、警告は発生しません。

結果をキャプチャする必要があることをコンパイラに伝えるには、メソッド宣言の前に@warn_unused_resultを追加する必要がありました。変更可能な形式を持つメソッド(例えばsortsortInPlace)に使用されます。コンパイラに伝えるために@warn_unused_result(mutable_variant="mutableMethodHere")を追加します。

ただし、Swift 3では、動作が反転しています。すべてのメソッドは戻り値がキャプチャされていないことを警告するようになりました。警告が不要であることをコンパイラに伝えたい場合は、メソッド宣言の前に@discardableResultを追加します。

戻り値を使用したくない場合は、を明示的にアンダースコアに割り当ててコンパイラに通知する必要があります。

_ = someMethodThatReturnsSomething()

これをSwift 3に追加する動機:

  • 潜在的なバグの防止(例:コレクションを変更すると考えてsortを使用)
  • 他の共同作業者のために結果をキャプチャしない、またはキャプチャする必要がないという明示的な意図

UIKit APIはこれに遅れをとっているように見えます。戻り値をとらえずにpopViewController(animated:)を完全に通常の(もっと一般的ではないにしても)使用するために@discardableResultを追加しないようにします。

続きを読む

494
tktsubota

人生があなたにレモンを与えるとき、延長をしなさい:

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も追加しました。

38
CodeReaper

Swift 3では、宣言された戻り値を持つ関数の戻り値を無視すると警告が発生します。

これをオプトアウトする1つの方法は、関数に@discardableResult属性を付けることです。この機能を制御することはできないので、それは機能しません。

警告を取り除くもう1つの方法は、値を_に割り当てることです。これは、メソッドが値を返すことを知っているが、それをメモリに保持したくないということをコンパイラに知らせます。

let _ = navigationController?.popViewController(animated: true)
24
Matthew Seaman

Screenshot 1

work correctly if kept as it isだがnumber of warning increases.

解決策は単にreplace it with underscore ( _ )ですが醜いようですが。

Eg.  _ = navigationController?.popViewController(animated: true)

Screenshot 2

5

つかいます discardableResult この状態で。

<Swift Programming Language>の「言語リファレンス - 属性」の章に従ってください。

discardableResult

値を返す関数またはメソッドが結果を使用せずに呼び出されたときにコンパイラの警告を表示しないようにするには、この属性を関数またはメソッドの宣言に適用します。

https://developer.Apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Attributes.html#//Apple_ref/doc/uid/TP40014097-CH35-ID347

<Swift Programming Language>のLanguage Guide - Methodsの章にもデモがあります。

@discardableResult
    mutating func advance(to level: Int) -> Bool {
    ...
return true
}

戻り値を無視するためにadvance(to :)メソッドを呼び出すコードは必ずしも間違いではないため、この関数は@discardableResult属性でマークされています。この属性について詳しくは、属性を参照してください。

https://developer.Apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Methods.html#//Apple_ref/doc/uid/TP40014097-CH15-ID234

1
black_pearl

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)
    }
}
0