2017-01-07 11 views
6

मैं कि क्या सामान्य वर्ग प्रकार किसी सरणी है जाँच करना चाहते हैं:जेनेरिक क्लास प्रकार की जांच कैसे करें सरणी है?

func test<T>() -> Wrapper<T> { 
    let isArray = T.self is Array<Any> 
    ... 
} 

लेकिन यह असंबंधित प्रकार के 'T.type' 'सरणी' से

कास्ट ने चेतावनी दी है हमेशा विफल रहता है

मैं इस समस्या को कैसे हल कर सकता हूं?

जोड़ा गया: मैंने अपने कोड को गिस्ट पर अपलोड कर लिया है। https://gist.github.com/nallwhy/6dca541a2d1d468e0be03c97add384de

मैं जो करना चाहता हूं वह है कि यह मॉडल की एक सरणी या सिर्फ एक मॉडल के अनुसार जेसन प्रतिक्रिया को पार्स करना है।

+0

संबंधित: [मैं कैसे पता चलेगा यदि एक वस्तु एक संग्रह है? (स्विफ्ट)] (http://stackoverflow.com/q/41236021/2976878) – Hamish

उत्तर

2

टीकाकार @Holex कहते हैं, आप Any उपयोग कर सकते हैं। Mirror के साथ संयोजित और आप, उदाहरण के लिए, कुछ इस तरह कर सकता है:

func isItACollection(_ any: Any) -> [String : Any.Type]? { 
    let m = Mirror(reflecting: any) 
    switch m.displayStyle { 
    case .some(.collection): 
     print("Collection, \(m.children.count) elements \(m.subjectType)") 
     var types: [String: Any.Type] = [:] 
     for (_, t) in m.children { 
      types["\(type(of: t))"] = type(of: t) 
     } 
     return types 
    default: // Others are .Struct, .Class, .Enum 
     print("Not a collection") 
     return nil 
    } 
} 

func test(_ a: Any) -> String { 
    switch isItACollection(a) { 
    case .some(let X): 
     return "The argument is an array of \(X)" 
    default: 
     return "The argument is not an array" 
    } 
} 

test([1, 2, 3]) // The argument is an array of ["Int": Swift.Int] 
test([1, 2, "3"]) // The argument is an array of ["Int": Swift.Int, "String": Swift.String] 
test(["1", "2", "3"]) // The argument is an array of ["String": Swift.String] 
test(Set<String>()) // The argument is not an array 
test([1: 2, 3: 4]) // The argument is not an array 
test((1, 2, 3)) // The argument is not an array 
test(3) // The argument is not an array 
test("3") // The argument is not an array 
test(NSObject()) // The argument is not an array 
test(NSArray(array:[1, 2, 3])) // The argument is an array of ["_SwiftTypePreservingNSNumber": _SwiftTypePreservingNSNumber] 
-1

आप कोई तर्क नहीं दे रहे हैं, इसलिए कोई प्रकार नहीं है और एक सामान्य कार्य समझ में नहीं आता है। या तो सामान्य प्रकार निकालें:

func() {} 

या, यदि आप एक तर्क पास करना चाहते हैं:

let array = ["test", "test"] 
func test<T>(argument: T) { 
    let isArray = argument is Array<Any> 
    print(isArray) 
} 

test(argument: array) 

प्रिंटों: true

+0

@shallow थ्रेड मैंने उदाहरण कोड बदल दिया है। – mayTree

+1

@mayTree आपको अभी भी कोई तर्क नहीं है, यानी आप एक प्रकार से गुजर रहे हैं। 'टी' के प्रकार को कैसे पाया जाना चाहिए? आप 'टी' के रूप में वापस आने की विधि की क्या अपेक्षा करते हैं? – shallowThought

+0

इसके लिए आपको _generics_ क्यों चाहिए? एक सरल 'कोई भी' नौकरी भी कर सकता है - और 'सत्य' मूल्य कौन लौटाता है? क्योंकि यह आपकी विधि को निश्चित रूप से नहीं है। – holex

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