我試圖初始化包含使用repeatedValues初始化可選值數組,我驚訝地發現下面的代碼無法編譯數組初始化的速記可選值斯威夫特
let a: Int?[] = Int?[](count: 10, repeatedValue:nil)
// error - Value of Int?[]? not unwrapped; did you mean to use '!' or '?'?
有趣的是該類型簽名Int?[]?
,例如可選Int
的可選Array
。這感覺就像一個錯誤,但也許有一些我錯過了語法。我查看了一些語言參考,但尚未找到答案。
更明確的Array<Int?>
類型初始化工作正常
let b: Int?[] = Array<Int?>(count: 10, repeatedValue:nil)
// compiles fine
有沒有其他人遇到這個,可以提供一些線索?
編輯
夫婦額外的工作與非可選類型的例子強調失敗
let c: Int[] = Int[](count: 10, repeatedValue:0)
// non-optional shorthand works fine
class D { var foo = 1 }
let d: D[] = D[](count:10, repeatedValue:D())
// custom class works fine using the shorthand too
enum E { case a, b, c, d, e }
let e: E[] = E[](count:10, repeatedValue:.e)
// enums work too
不知道如果這有助於擺脫對這個問題的光,但是如果你讓編譯器推斷這個類型,例如'l et a = Int?[](count:10,repeatedValue:nil)',它編譯。然而,'a'在Playground視圖中被描述爲'{[nil,nil,nil,nil,nil,nil,nil,nil,nil,nil]}',而不是'[nil,nil,nil,nil,nil ,nil,nil,nil,nil,nil]',這似乎意味着實際的類型不是你期望的那個特定的初始化器。我還沒有足夠了解斯威夫特,但還不知道這意味着什麼,但我想我會提到它。 – Aky
@Aky那些外括號在那裏,因爲數組本身也是可選的,而不僅僅是包含的類型。如果您明確將該類型添加到聲明中,您可以看到這一點 - 「let a:Array? = Int?[](count:10,repeatedValue:nil)' –
Neil
@BryanChen由於Int []和Int?[]是兩種不同的類型,所以不能編譯。第一個是一個整數數組('Array'),而第二個是可選整數數組('Array ') –
Neil