2014-09-20 58 views
11

我想通過reduce函數連接字符串數組的元素。現在嘗試了一下,但我不明白問題到底是什麼。這是我相信應該做的伎倆。我曾嘗試過其他的選擇也一樣,但由於數額巨大,我會等待一些輸入:String array reduce

var genres = ["towel", "42"] 
var jointGenres : String = genres.reduce(0, combine: { $0 + "," + $1 }) 

錯誤:

..:14:44: Cannot invoke '+' with an argument list of type '(IntegerLiteralConvertible, combine: (($T6, ($T6, $T7) -> ($T6, $T7) -> $T5) -> ($T6, ($T6, $T7) -> $T5) -> $T5, (($T6, $T7) -> ($T6, $T7) -> $T5, $T7) -> (($T6, $T7) -> $T5, $T7) -> $T5) -> (($T6, ($T6, $T7) -> $T5) -> $T5, (($T6, $T7) -> $T5, $T7) -> $T5) -> $T5)'

從我的理解,$ 0如果被推斷爲一個字符串和$ 1,由與$ 0的組合,也應該以String的形式出現。我不知道這裏的類型系統是怎樣的。任何想法?

回答

21

您降低封閉或許應該是這樣的:

var jointGenres : String = genres.reduce("", combine: { $0 == "" ? $1 : $0 + "," + $1 }) 

這有""而不是0喜歡你了,並確保沒有多餘的逗號在返回值的開始。

原始代碼不起作用,因爲在您的答案中,在documentation中表示爲U的返回類型最初爲0,而您嘗試向其中添加字符串。在你的情況下,你真的希望U和T代表字符串而不是Ints。

+0

我忽略了第一個參數的含義,謝謝! – 2014-09-20 18:51:33

2

問題是你的第一個參數reduce。這是一個累加器,它是一個整數字面值,它在塊的第一次運行時以$0的形式傳遞。您正在要求reduce函數向此添加一個字符串。

而不是0作爲累加器參數,您應該傳遞"",一個空字符串。

這工作:

var genres = ["towel", "42"] 
var jointGenres : String = genres.reduce("", combine: { $0 + "," + $1 }) 
+1

這不完全正確,你需要@erdekhayser正在使用的三元表達式。 – iluvcapra 2014-09-20 19:51:16

8

可可已經有這樣做的功能。它需要對NSArray進行類型轉換。在這裏,因爲你需要特殊處理的第一個元素

let ints = [1,5,9,15,29] 
let listOfInts = (ints as NSArray).componentsJoinedByString(",") 
+0

這太容易了lol – quemeful 2017-02-28 16:29:46

8

減少是不是一個簡單的解決方案:

var genres = ["towel", "42"] 
var joinGenres = (genres as NSArray).componentsJoinedByString(",") 

令我驚訝的是,這個功能也可以應用到的字符串比其他類型的數組。字符串的連接方法是一種更合理的:

let strings = ["a", "b", "c"] 
let joinedString = ",".join(strings) 

如果你知道數組不爲空,有一個與減少也避免了條件語句另一個可能的解決方案:

let joinedStrings = strings[1..<strings.count].reduce(strings[0]) { $0 + "," + $1 } 
+0

不得不在Swift 4中做'joinedString = strings.joined(separator:「;」)' – 2017-11-06 09:45:55