内联 if 语句在 void 返回闭包中改变 inout 参数,奇怪的错误(错误:类型 'Int1' 不符合协议"布尔类型")



我遇到了一个有点奇怪的(编译时(错误,我无法理解。对于以下代码段,给出了错误:

/* error: type 'Int1' does not conform to protocol 'BooleanType' */
let closure1 : (inout foo: Int) -> () = {
    foo -> () in
    (foo<0 ? (foo = -1) : (foo = 1))
}

错误:类型"Int1"不符合协议"布尔类型">

请注意,Int1 在这里不是拼写错误。

问题 1:为什么不允许使用单个内联 if 语句(结果为 '()'(作为 void 返回闭包的隐式返回类型?

问题2:出于好奇,Int1类型是什么?(奇怪的是,相同的错误消息,即使修改上面的闭包以类似的方式对不同类型的操作,也会给出Int1 ...(。

为什么我对这感兴趣?我有一些闭包,我想以类似于下面closure1Anon的匿名形式使用,但由于此错误,我不能。

细节和我自己对此事的(无成果(调查如下。


如上所述,当---在 void 返回闭包中---使用单个内联 if 语句(包括对 inout 参数的赋值(时,会提示错误。

我们可以验证内联语句的结果是空元组(),请考虑例如:

var foo = -4
print((foo<0 ? (foo = -1) : (foo = 1)).dynamicType) // ()
print(foo)                                          // -1

。因此,使用作为 void 返回闭包的 return 语句应该是可以的(例如,请参阅下面的赋值后返回示例closure4(。

下面是错误的闭包(closure1closure1Explicitclosure1Anon(以及五个非常相似/相关的闭包(closure2closure7(。

/* error: type 'Int1' does not conform to protocol 'BooleanType' */
let closure1 : (inout foo: Int) -> () = {
    foo -> () in
    (foo<0 ? (foo = -1) : (foo = 1))
}
/* same error */
let closure1Explicit : (inout foo: Int) -> () = {
    foo -> () in
    return (foo<0 ? (foo = -1) : (foo = 1))
}
let closure1Anon : (inout foo: Int) -> () = { ($0<0 ? ($0 = -1) : ($0 = 1)) }

还行:

/* The following are all OK */
let closure2 : (inout foo: Int) -> () = {
    (inout foo: Int) -> () in
    (foo<0 ? (foo = -1) : (foo = 1))
} // thanks @MartinR
let closure3 : (inout foo: Int) -> () = {
    foo -> () in
    let _ = (foo<3 ? (foo = 1) : (foo = 2))
}
let closure4 : (inout foo: Int) -> () = {
    foo -> () in
    (foo<3 ? (foo = 1) : (foo = 2))
    return ()
}
let closure5 : (inout foo: Int) -> () = {
    foo -> () in
    let bar = (foo<3 ? (foo = 1) : (foo = 2))
    return bar
}
/* Error must be related to inout as the two
   following closures works fine */
let closure6 : () -> () = {
    () -> () in
    var a = 0
    return (a<0 ? (a = -1) : (a = 1))
}
var globalVar = 1
let closure7 : () -> () = {
    () -> () in
    (globalVar<0 ? (globalVar = -1) : (globalVar = 1))
}

我无法为世界弄清楚为什么上面的closure1/closure1Explicit/closure1Anon会产生此错误。也许有人可以为我阐明这一点?


最后说明:在这种情况下,以下看似相似的SO线程似乎无关紧要:

  • 类型"Int"不符合协议"布尔类型">

我使用的是 Swift 2.1.1

和 Xcode 7.2.1。

(添加这个薄的答案以结束不再相关的问题(

上面问题中描述的错误在 Swift 2.2 (Xcode 7.3( 和 IBM Sandbox 的 Swift 3.0-dev 中都不再存在;因此这个问题似乎在 Swift 2.2 的发布中得到了修复。

相关内容

最新更新