簡體   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