Swift:如何访问“_”参数的值?

时间:2015-12-07 14:58:28

标签: swift function parameters

我注意到这是Swift中的一个有效函数:

promise = Validatebatch(); // call Validatebatch the first time and store the returned Promise object

promise = promise.then(Validatebatch); // another call to Validatebatch, only triggered after the previous has ended

promise = promise.then(Validatebatch); // again, this third Validatebatch call will only happen after the second one has ended.

如何访问参数?

修改 另外一个问题,是否有一个有效/良好的用例?

3 个答案:

答案 0 :(得分:3)

如何访问参数?

你没有。使用该语法,您明确表示您不想访问该参数。

用例

假设您可以访问非常强大的异步API,如下所示。

func theAnswerToLife(success:(answer: String) -> (), failure:(error: NSError) -> ())
  

是的,当然我保持执行秘密

现在,如果函数theAnswerToLife确实找到答案,则调用success闭包,否则调用failure

你被迫传递两个闭包/函数,但你真的只对answer感兴趣,如果出现问题你不介意实际的错误。

所以你可以定义

func tellEveryone(answer: String) {
    print("The answer to life is " + answer)
}

func badNews(_:NSError) {
    print("Something went wrong, we will try again tomorrow")
}

badNews可以作为第二个参数传递给theAnswerToLife,将来查看代码的人会立即明白badNews不关心收到的参数。

theAnswerToLife(tellEveryone, failure: badNews)

答案 1 :(得分:2)

这就是所谓的通配符匹配模式,它只是为了不能使用参数而引入,因为你只是不关心它。

来自documentation

  

通配符模式匹配并忽略任何值,并由下划线(_)组成。如果您不关心要匹配的值,请使用通配符模式。

如果需要访问参数值,则必须使用正确的标识符。

关于问题的更新部分。我不知道你为什么要这样做(只是一个疯狂的想法),但如果你想完全隐藏public类的方法的参数名称,但仍然能够在{{1}中使用它们} sub-class,你可以这样做:

private

使用您的库的任何外部人员都会使用抽象public class Foo { func test(_: String, _: Int) { print("[Ignored]") } } private class Bar: Foo { override func test(stringArgument: String, _ intArgument: Int) { print("\(stringArgument) \(intArgument)") } } 而不知道Foo方法的参数名称。

答案 2 :(得分:1)

使用_的关键是你对使用参数不感兴趣。一个示例用法是

if let _ = someVariable as? String {
   //Do stuff here if someVariable is a string
   //But I'm not interested in accessing the unwrapped value, so I set the unwrapped variable name to _
}