2014-12-31 9 views
6

मैं प्रकार के सरणी पर समारोह contains उपयोग करना चाहते हैं AnyObjectस्विफ्ट सरणी - उपयोग प्रकार AnyObject की "शामिल है"

import UIKit 

var resultArray: Array<AnyObject> = Array() 
resultArray.append(50) 
resultArray.append(false) 
resultArray.append("Test string") 
let found = contains(resultArray, 50) 

मैं त्रुटि मिलती है:

Type 'AnyObject -> L' does not conform to protocol 'IntegerLiteralConvertible' 

enter image description here

+0

किसी सरणी में प्रकारों को मिश्रण न करें, यह एक अच्छा अभ्यास नहीं है। इस मामले में 50 स्ट्रिंग बनाएं ताकि सभी वस्तुओं में स्ट्रिंग प्रकार हो। – zaph

+0

फिर 'AnyObject' का उद्देश्य क्या है? – Khawar

+1

जैसा कि जैफ ने कहा था, किसी भी ऑब्जेक्ट का उपयोग आदर्श नहीं है जब तक कि आपको वास्तव में आवश्यकता न हो। AnyObject के उद्देश्य का एक उदाहरण है जब एपीआई लिखना या उपयोग करना, कुछ जानकारी प्राप्त करना जिसमें डेटा प्रकार आपके द्वारा अनिश्चित है, प्रोग्रामर। जैसे। पार्स का ढांचा AnyObject का उपयोग करता है क्योंकि यह नहीं जानता कि आप स्ट्रिंग, बूल, इंट आदि संग्रहित कर रहे हैं या नहीं, तो आपको इसे जल्द से जल्द परिवर्तित करना होगा। –

उत्तर

9

मैं सहमत हूं टिप्पणियों और अन्य उत्तर के साथ; AnyObject अच्छा अभ्यास नहीं है, लेकिन क्या तुम सच मेंAnyObject उपयोग करना चाहते हैं , तो आपको एक NSArray वस्तु के रूप में AnyObjects के अपने सरणी का इलाज कर सकते हैं और फिर समारोह containsObject() का उपयोग करें:

if (resultArray as NSArray).containsObject(AnyObjectOfAnyType) { 
    // Do something 
} 
+0

@trevoj, धन्यवाद यह काम करता है। लेकिन मैं अधिक कुशल समाधान की तलाश में हूं। – Khawar

+0

@ खवार अधिक कुशल कैसे? अगर आपको कथन में किसी भी संभावित वस्तु की जांच करने में सक्षम होना चाहिए। – trevorj

+0

लॉल .. आप सही हैं। मैं 'NS' से शुरू होने वाले सभी प्रकारों से छुटकारा पाने की कोशिश कर रहा था :)। अगर मुझे कोई भी नहीं मिला (मुझे विश्वास है), तो मैं आपको उत्तर के रूप में उत्तर के रूप में चिह्नित करूंगा। मैं वास्तव में आपके समाधान की सराहना करता हूं। – Khawar

4

आप शायद इस में Any का उपयोग करना चाहिए उदाहरण के बाद से आप गैर-वर्ग के प्रकार धारण कर रहे हैं - अन्यथा आप NSThing एस पर निहित रूपांतरण करेंगे।

लेकिन यहाँ एक गैर ObjC-इंटरॉप जिस तरह से यह करना है:

let found = contains(resultArray) { ($0 as? Int) == 50 } 
+0

यूप। मानक, सुरक्षित और पठनीय, मैं कहूंगा। –

+0

@ एस्पेड, उत्तर के लिए धन्यवाद। लेकिन यह केवल 'Int' की जांच कर रहा है। मैं उदाहरण के लिए '50' की जांच कर रहा हूं। मुझे एक बयान की आवश्यकता है जो रनटाइम पर किसी भी प्रकार के प्रकार की जांच कर सकता है। – Khawar

+1

मैं वास्तव में टकराव का मतलब नहीं हूं जब मैं कहता हूं: आपको शायद रनटाइम पर इस तरह के "गतिशील" व्यवहार की आवश्यकता नहीं है। मैं उस वास्तविक समस्या के संदर्भ में एक प्रश्न पोस्ट करने का सुझाव दूंगा जिसे आप हल करना चाहते हैं - संभावना है कि आप इसे संकलन-समय बहुरूपता (यानी एक सामान्य एल्गोरिदम) या रनटाइम (यानी कक्षाओं/प्रोटोकॉल और गतिशील प्रेषण के साथ) कर सकते हैं। AnyObject का उपयोग कई कोणों से बहुत गड़बड़ है (आप @objc भूमि में फंस जाते हैं, रनटाइम पर अक्षम, प्रकार-असुरक्षित आदि)। –

0

आप प्रकार के बीच अंतर करने के लिए is कीवर्ड का उपयोग कर सकते तो Airspeed वेग से कोड का टुकड़ा का उपयोग ऊपर खोज करना है।

if resultArray[0] is String { 
    found = contains(resultArray) { 
     ($0 as? String) == "hello" 
    } 
} else if resultArray[0] is Int { 
    found = contains(resultArray) { 
     ($0 as? Int) == 50 
    } 
} 

नोट:: .. यहाँ एक उदाहरण है कि आप को संशोधित करने और अगर जरूरत हो पर अतिरिक्त प्रकार जोड़ सकते हैं तुमने कहा था अपने सरणी एक समय में केवल 1 प्रकार में शामिल होंगे - यह महत्वपूर्ण है।

+0

उत्तर के लिए धन्यवाद। लेकिन मुझे एक सामान्य जांच की ज़रूरत है, जिसका उपयोग स्विफ्ट द्वारा समर्थित किसी भी प्रकार के साथ किया जा सकता है। आपके उदाहरण में कई चेक हैं। क्या होगा यदि ऐरे में 10 अलग-अलग प्रकार की वस्तुएं हो सकती हैं, तो बयान के मामले में '10' होगा? – Khawar

+0

ओह मैंने सोचा था कि आपका मतलब है कि पूरी सरणी एक प्रकार का होगा जब आपने कहा था "सभी इंडेक्स पर ऑब्जेक्ट्स समान होंगे अर्थात् स्ट्रिंग्स या यूजर" ... लूप के उपयोग के बिना प्रति तत्व आधार पर मूल्यांकन करना, मैं नहीं करता दुर्भाग्य से नहीं पता। - लूप के लिए मूल रूप से ऊपर दिखाए गए कोड का उपयोग कर सकते हैं, लेकिन केवल प्रत्येक तत्व का मूल्यांकन करें; हालांकि यह बड़े सरणी के लिए एक अच्छा विचार नहीं होगा। आपके प्रश्न के लिए फिर से। 10 अगर बयान, एक स्विच केस बेहतर अनुकूल होगा: पी –

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