2015-09-30 16 views
8

एक अभ्यास के रूप में, मैं एक कम समारोह के रूप में मानचित्र, लंबाई और फ़िल्टर लिखने की कोशिश कर रहा हूं।स्विफ्ट लेखन मानचित्र, लंबाई, फिल्टर

func map<T>(array: [T], f: (T->T)) -> [T] { 
    return array.reduce([]) { 
     (var seed, value) in 
     seed.append(f(value)) 
     return seed 
    } 
} 

func length<T>(array: [T]) -> Int { 
    return array.reduce(0){ (x,_) in x + 1 } 
} 

func filter<T>(array: [T], predicate: (T->Bool)) -> [T]{ 
    return array.reduce([]){ 
     (var seed, value) in 
     if predicate(value){ 
      seed.append(value) 
     } 
     return seed 
    } 
} 

क्या यह सबसे सुरुचिपूर्ण वाक्यविन्यास है जिसे मैं उन कार्यों को कम करने के लिए उपयोग कर सकता हूं? दूसरा प्रश्न: नक्शा एक फ़ंक्शन f लेता है f: (टी-> टी) असल में टाइप कहता है कि मैं केवल कुछ प्रकार का टी वापस कर सकता हूं, लेकिन अगर मैं जो फ़ंक्शन लिखता हूं वह टाइप टी को एक बूल, या इंट ... मैं इसे कैसे पूरा करूं? मानचित्र की तरह लगता है मौजूद नहीं है

उत्तर

6

एक मानचित्रण जो एक (संभवतः अलग) में एक प्रकार T बदल देती टाइप S के लिए बस दो प्रकार प्लेसहोल्डर का उपयोग करें:

func map<T, S>(array: [T], f: (T->S)) -> [S] { 
    return array.reduce([]) { 
     (var seed, value) in 
     seed.append(f(value)) 
     return seed 
    } 
} 

उदाहरण:

let x = map([1, 2, 3], f: { String($0) }) 
print(x) // ["1", "2", "3"] 

चाहे यह "यह सबसे सुरुचिपूर्ण वाक्यविन्यास है" भीहैव्यक्तिगत राय का मामला। आप + के साथ सरणी संयोजन द्वारा append() विधि की जगह तो seed मानकों की जरूरत है चर नहीं हो:

func map<T, S>(array: [T], f: (T->S)) -> [S] { 
    return array.reduce([]) { 
     (seed, value) in 
     seed + [f(value)] 
    } 
} 

कौन सा रूप

func map<T, S>(array: [T], f: (T->S)) -> [S] { 
    return array.reduce([]) { $0 + [ f($1) ] } 
} 
इसी

आशुलिपि पैरामीटर नाम के साथ लिखा जा सकता है:

func filter<T>(array: [T], predicate: (T->Bool)) -> [T]{ 
    return array.reduce([]) { predicate($1) ? $0 + [ $1 ] : $0 } 
} 

बस ध्यान दें किका कार्यान्वयनऔर filter() reduce() (लूप के बजाए) का उपयोग अप्रभावी है क्योंकि नई सरणी प्रत्येक कमी चरण में बनाई गई है। उदाहरण

एक विश्लेषण के लिए

के लिए देखें। व्यायाम (जैसा कि आपने कहा था) के लिए यह ठीक है, बस उत्पादन में इस तरह का उपयोग न करें)।

+0

Muchas ग्रेसियस, धन्यवाद! वास्तव में जिस प्रकार की प्रतिक्रिया मैं ढूंढ रहा था। स्विफ्ट शुरुआत में एक अजीब परिदृश्य है;) – Seneca

+0

अजीब परिदृश्य जो आपको इस कोशिश करने के लिए प्रेरित करता है! :) – Grimxn

+0

जाहिर है ट्रांसड्यूसर की तरह कुछ मौजूद है;) तेजी से कुछ बुनियादी ज्ञान हासिल करने का शानदार तरीका। – Seneca

0

विस्तार CollectionType

extension CollectionType { 
func MyMap<T>(transform: (Self.Generator.Element) -> T) -> [T] { 
    let list = self.reduce([T]()) { (var seed, value) in 
     seed.append(transform(value)) 
     return seed 
    } 
    return list 
}} 

तो का उपयोग [1,2,3] .MyMap ({$ 0 + 1})

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