2014-09-20 8 views
11

को कम करता है मैं कम फ़ंक्शन के माध्यम से स्ट्रिंग सरणी के तत्वों में शामिल होने का प्रयास कर रहा हूं। एक बिट के लिए अब कोशिश की, लेकिन मुझे यह नहीं मिल सकता कि समस्या वास्तव में क्या है। यही वह है जो मुझे विश्वास है कि चाल चलनी चाहिए। मैं अन्य विकल्प भी कोशिश की है, लेकिन भारी मात्रा में मैं कुछ इनपुट के लिए इंतजार करेंगे दिया:स्ट्रिंग सरणी

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 के साथ संयोजन, एक स्ट्रिंग के रूप में भी परिणाम होना चाहिए। मुझे नहीं पता कि यहां टाइप सिस्टम के साथ क्या सौदा है। कोई उपाय?

उत्तर

21

आपका बंद को कम शायद इस तरह दिखना चाहिए:

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

यह 0 के बजाय की तरह आप था "" है, और सुनिश्चित करें कि कोई अतिरिक्त अल्पविराम है कि वहाँ बनाता है वापसी मान की शुरुआत में।

मूल कोड काम नहीं किया क्योंकि documentation में यू के रूप में प्रतिनिधित्व किए जाने वाले रिटर्न प्रकार मूल रूप से आपके उत्तर में 0 था, जबकि आप इसे स्ट्रिंग जोड़ने की कोशिश कर रहे हैं। आपके मामले में, आप वास्तव में इन दोनों के बजाय स्ट्रिंग्स का प्रतिनिधित्व करने के लिए यू और टी दोनों चाहते हैं।

+0

मैंने पहले पैरामीटर के अर्थ को अनदेखा किया, धन्यवाद! –

2

समस्या reduce पर आपका पहला तर्क है। यह एक संचायक है यह एक पूर्णांक शाब्दिक है, और यह क्या ब्लॉक के पहली बार चलाने पर $0 के रूप में पारित किया है। आप इस पर एक स्ट्रिंग जोड़ने के लिए फ़ंक्शन को कम करने के लिए कह रहे हैं।

0 के बजाय संचयक तर्क के रूप में, आपको "", एक खाली स्ट्रिंग पास करनी चाहिए।

यह काम करता है:

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

यह पूरी तरह से सही नहीं है आप: वहाँ कम करने कि भी सशर्त से बचा जाता है के साथ एक और संभव समाधान है आप जानते हैं कि सरणी खाली नहीं है, तो

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

: स्ट्रिंग के शामिल होने के विधि इस उद्देश्य के लिए बेहतर है टर्नरी अभिव्यक्ति @erdekhayser का उपयोग कर रहा है। – iluvcapra

8

कोको पहले से ही यह करने के लिए एक समारोह है। यह एनएसएआरएआरई को टाइपकास्ट की आवश्यकता से मारा जाता है। यहाँ

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

यह इतना आसान है lol – quemeful

8

को कम कर रहा है नहीं एक सीधा समाधान है, क्योंकि आप पहले तत्व के लिए विशेष हैंडलिंग की जरूरत है:

var genres = ["towel", "42"] 
var joinGenres = (genres as NSArray).componentsJoinedByString(",") 
मेरे आश्चर्य करने के लिए

, इस समारोह भी स्ट्रिंग के अलावा अन्य प्रकार के सरणियों के लिए लागू किया जा सकता है।

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

स्विफ्ट 4 में 'joinString = strings.joined (विभाजक: ";")' करना था –

संबंधित मुद्दे