2014-06-06 47 views
2

在.playground我只是在探索Swift,我試圖以奇怪的方式創建一個數組,只是因爲。在Swift中通過數組迭代時,輸出「VSs5Range」是什麼?

所以這不會產生,項目0,1,2陣列,... 50,像我天真地希望:

let numberArray = [0...50] 

,並試圖通過它來迭代:

for num in numberArray { 
    println("The number is \(num)") 
} 

給出了這樣的控制檯輸出:

The number is VSs5Range (has 2 children) 

這是什麼意思?在.swift文件中運行它,構建失敗,所以控制檯輸出不會給我任何東西。

+0

只需使用:'let numberArray = 0 ... 50' – k06a

回答

5

發生了什麼事是你創建具有[0...50]一個數組,但數組有一個元素:對象0...50,這是斯威夫特一個新的結構,表示一個範圍(顯然類型VSs5Range

所以你的循環初始陣列上正在顯示單個數組元素,它本身寫的類型名稱和它的端點的數量。

範圍是一個數組,它的東西在一個生成器(C#中的迭代器)和一個測試單元之間。例如,您可以在switch語句(case 0..3:)中使用它,並從中生成數字(for i in 0..3 {})。我個人覺得它很酷!

+0

啊,好的。那麼這個神祕的VSs5Range是Swift中的一個類型?我對這個詞的谷歌搜索只得到了兩個結果 - 他們兩個都沒有用Swift做。是的,我也嘗試迭代範圍(對於0 ... 50中的num),它確實非常酷! – Christian

+0

VSs5Range是Range的錯位名稱。在內部,很多Swift的東西都以三個字母開頭,後面跟着一個或多個標識符。 5Range只是預設長度的範圍。你也可以看到像3foo3bar7bazinga這樣的東西,它有三個標識符的複合名稱。 –

+0

@AnalogFile好的謝謝。你知道我怎麼能打印一個變量的類型?編輯:按下輸入太快。如果我嘗試使用className,我什麼也得不到。 – Christian

0

如果你這樣做,而不是:

let numberArray = 0...50 

for num in numberArray { 
    println("The number is \(num)") 
} 

你可能會看到一個快樂的結果。

我還沒有進入足夠的Swift書,但我懷疑括號只針對特定的單個對象......而使用「...」和「..」範圍說明符將爲您創建陣列,不需要括號。

+0

這並不真正創建數組。試試'let numberArray:Array = 0 ... 50',你會得到一個編譯錯誤。但是,正如你所看到的,你也可以遍歷範圍。 – nschum

+0

啊,謝謝澄清。 –

+0

謝謝,@MichaelDautermann。這確實奏效,但正如nschum提到的那樣,它不是一個數組。我想這也是我對這件事的困惑的一部分。 – Christian

1

您使用單個對象(即「範圍」)創建了一個數組。

你看到的是範圍對象,它有一個奇怪的無證類的內部表示(類似於NSArray的子​​類,你有時會看到。)

正如邁克爾的回答表明,你不一定需要創建數組。你可以用range對象直接做很多事情(比如迭代)。

+0

謝謝!是的,我已經玩過遍歷一個非常整齊的範圍。然後我遇到了這個問題,真的很困惑。再次感謝! – Christian