gpt4 book ai didi

swift - 内联 if 语句在 void 返回闭包中改变 inout 参数,奇怪的错误(错误 : type 'Int1' does not conform to protocol 'BooleanType' )

转载 作者:可可西里 更新时间:2023-10-31 23:44:15 26 4
gpt4 key购买 nike

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

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

Error: type 'Int1' does not conform to protocol 'BooleanType'

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

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

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

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

详细信息和我自己对此事的(非富有成果的)调查如下。


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

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

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

...所以它应该可以用作 void return 闭包的 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 线程似乎不相关:


我使用的是 Swift 2.1.1 和 Xcode 7.2.1。

最佳答案

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

上述问题中描述的错误不再出现在 Swift 2.2 (Xcode 7.3) 中,也不再存在于 IBM Sandbox 的 Swift 3.0-dev 中。 ;所以这个问题似乎已经在 Swift 2.2 的发布中得到解决。

关于swift - 内联 if 语句在 void 返回闭包中改变 inout 参数,奇怪的错误(错误 : type 'Int1' does not conform to protocol 'BooleanType' ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35184847/

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