繁体   English   中英

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

[英]Inline if statement mutating inout parameter in a void return closure, weird error (Error: type 'Int1' does not conform to protocol 'BooleanType')

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

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

错误:类型'Int1'不符合协议'BooleanType'

请注意,Int 1不是拼写错误。

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

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

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

详情和我自己(非富有成效)的调查问题如下。


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

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

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

...因此,对于void返回闭包使用return语句应该没问题(参见下面的closure4 -followed-by-return示例closure4 )。

下面跟随错误关闭( closure1closure1Explicitclosure1Anon )以及五个做工精细非常相似/关联关闭( closure2通过closure7 )。

/* 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线程似乎不相关:


我正在使用Swift 2.1.1和Xcode 7.2.1。

(添加这个简短的答案来关闭不再相关的问题)

上面问题中描述的错误不再存在于Swift 2.2(Xcode 7.3)中,也不存在于IBM Sandbox的Swift 3.0-dev中; 因此,Swift 2.2的发布似乎已经解决了这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM