web-dev-qa-db-ja.com

オプションのコールバックをSwift関数に渡す

私はSwift langを学習していますが、オプションのコールバック引数を関数に渡すことはできません:

_func dismiss(completion: () -> Void) {
    if (completion) {
        return self.dismissViewControllerAnimated(true, completion: completion)
    }
    self.dismissModalViewControllerAnimated(true)
}
_

エラーが表示されます-Type () -> Void does not conform to protocol 'LogicValue'

助言がありますか?

44
Kosmetika

Swift 3/4:の更新

オプションはブール式ではなくなり、廃止されたfunc dismissModalViewControllerAnimated(animated: Bool)はSwiftで使用できなくなりました。

完了パラメーターをオプションのクロージャーとして宣言し、それを

func dismiss(animated flag: Bool, completion: (() -> Void)? = nil)

オプションのクロージャーも必要です:

func dismiss(completion: (() -> Void)? = nil) {
    self.dismiss(animated: true, completion: completion)
}

古い(Swift 1.x?)答え:

completionパラメーターを(暗黙的にアンラップ)optionalクロージャー(() -> Void)!

func dismiss(completion: (() -> Void)!) {
    if (completion) {
        return self.dismissViewControllerAnimated(true, completion: completion)
    }
    self.dismissModalViewControllerAnimated(true)
}

しかし、あなたが呼び出すことができることに注意してください

self.dismissViewControllerAnimated(true, completion: completion)

いずれにしても、その関数のcompletionパラメーターもオプションであるためです。そして

func dismissModalViewControllerAnimated(animated: Bool)

廃止予定として実際にマークされます。

56
Martin R

上記のMartin Rの回答に追加するだけです。

コールバックはオプションである場合があり、暗黙的なパラメーター(感嘆符付き)の代わりに、オプションの演算子を使用します。

func dismiss(completion: (() -> Void)?) {
    if completion != nil {
        return self.dismissViewControllerAnimated(true, completion: completion!)
    }

    self.dismissModalViewControllerAnimated(true)
}
16
code ninja

コールバック宣言に_= nil_を追加して、呼び出し中にnilを渡さないようにすることをお勧めします。

_func dismiss(completion: (() -> Void)? = nil) {
    if (completion) {
        return self.dismissViewControllerAnimated(true, completion: completion)
    }
    self.dismissModalViewControllerAnimated(true) }
_

そして、次のように関数を呼び出すことができます:dismiss()

11
Rémy Virin