gpt4 book ai didi

swift - 为什么速记参数名称在这个 Swift 闭包中不起作用?

转载 作者:搜寻专家 更新时间:2023-10-31 22:34:22 24 4
gpt4 key购买 nike

这是一个接受两个整数和一个三参数函数的 Swift 函数,并调用传入的函数。

func p(x:Int, _ y:Int, _ f: (Int, Int, Int) -> ()) {
f(x, y, 0)
}

我可以使用尾随闭包语法和速记参数名称来调用它,没问题:

> p(1, 2) {print($0 + $1 + $2)}

3

这按预期工作。但是在 Foundation 库中,有一个名为 enumerateSubstringsInRange 的字符串方法,定义如下:

func enumerateSubstringsInRange(
_ range: Range<Index>,
options opts: NSStringEnumerationOptions,
_ body: (substring: String?,
substringRange: Range<Index>,
enclosingRange: Range<Index>,
inout Bool) -> ())

好吧,这很简单:函数有三个参数,最后一个是四参数函数。就像我的第一个例子!或者我想....

我可以通过尾随闭包语法使用此函数,但我不能使用速记参数名称!我不知道为什么。这是我尝试过的:

let s = "a b c"
"a b c".enumerateSubstringsInRange(s.characters.indices, options: .ByWords) {(w,_,_,_) in print(w!)}

a
b
c

一切都好;我只想打印出匹配的单词,一次一个。当我通过闭包指定为 ``{(w,,,_) in print(w!)}` 时,它就起作用了。但是,当我尝试使用速记参数语法编写闭包时,灾难:

> "a b c".enumerateSubstringsInRange(s.characters.indices, options: .ByWords) {print($0!)}
repl.swift:9:86: error: cannot force unwrap value of non-optional type '(substring: String?, substringRange: Range<Index>, enclosingRange: Range<Index>, inout Bool)' (aka '(substring: Optional<String>, substringRange: Range<String.CharacterView.Index>, enclosingRange: Range<String.CharacterView.Index>, inout Bool)')

那我做错了什么?!错误消息似乎表明闭包参数 $0args 的整个元组。事实上,当我尝试这样做时,情况确实如此!

>"a b c".enumerateSubstringsInRange(s.characters.indices, options: .ByWords) {print($0.0!)}

a
b
c

所以我很困惑。为什么在第一种情况下(我的函数 p,参数被理解为 $0$1 等,但在第二种情况下,所有参数都汇总到一个元组中?还是它们?FWIW,我找到了 enumerateSubstringsInRange here 的签名。

最佳答案

这取决于参数的个数。

例如,

func test( closure: (Int,Int,Int) -> Void ){
// do something
}

要使 test 按预期工作,您必须指定 $2(第三个参数)。编译器将推断出元组内的值,否则将推断出元组本身。

如果你没有指定匹配参数个数的$number。例如只指定$1,会编译出错。

// work as expected ( infer to int )
test{
print($2)
}
test{
print($1+$2)
}
test{
print($0+$1+$2)
}

// not work ( infer to tuple )
test{
print($0)
}

// not work ( cannot infer and compile error )
test{
print($1)
}

有一个问题与此问题相关。 Why is the shorthand argument name $0 returning a tuple of all parameters?

关于swift - 为什么速记参数名称在这个 Swift 闭包中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33359665/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com