在Swift的捕獲列表語法中似乎出現了一個奇怪的語法小故障。如果我聲明多個變量捕獲,捕獲符只適用於第一個:爲什麼捕獲說明符在捕獲列表中是可選的?
let closure = { [unowned x, y] in … }
現在我希望y
是unowned
,但它似乎並沒有這樣的情況:
class Test {
var callback: (Void -> Void)?
init() {
print("init")
}
deinit {
print("deinit")
}
}
func makeScope() {
let x = Test()
let y = Test()
y.callback = { [unowned x, y] in
print(y)
}
}
makeScope()
print("done")
此打印:
init
init
deinit
done
所以y
似乎強烈地捕獲並創建一個保留週期,防止物體被交易位於。是這樣嗎?如果是的話,允許列表中的「空」捕獲說明符是否有意義?還是有沒有原因[unowned x, y]
不被視爲[unowned x, unowned y]
?
很好,趕快,謝謝。你認爲編譯器在引用類型前缺少說明符時至少會產生警告嗎? – zoul
@zoul:不,請看上面的例子。 –
太好了,謝謝!我認爲讓我不高興的是,'無主x,y'這個簡單常見的例子看起來有誤導性(參見圖1)。'用類C語言編寫的int a,b'),而使用臨時變量可以很容易地(更明確地)解決無說明符引用類型捕獲的罕見情況。 – zoul