2015-06-02 13 views
24

में ऑब्जेक्ट्स की एक सरणी के माध्यम से लूप कैसे करें I सरणी में संग्रहीत ऑब्जेक्ट के यूआरएल तक पहुंचने का प्रयास कर रहा हूं, लेकिन मुझे त्रुटियां मिल रही हैं कि मैं किस तरीके का उपयोग कर रहा हूं।स्विफ्ट

let userPhotos = currentUser?.photos 

    for var i = 0; i < userPhotos!.count ; ++i { 
     let url = userPhotos[i].url 
    } 

यहाँ मैं प्राप्त

सदस्य 'url'

नहीं मिल सका है और एक foreach के साथ:

for photo in userPhotos { 

     Utils.getImageAsync(photo.url , completion: { (img: UIImage?) ->() in 

     }) 
    } 

मैं:

'[मॉडल एटैचमेंट]?' एक सदस्य नामित नहीं है 'जेनरेटर'

मेरे सरणी var photos: Array<ModelAttachment>? है और मेरी ModelAttachment इस तरह दिखता है:

class ModelAttachment :Model { 
var id: String? 
var url: String? 
var thumb: String? 
} 

मैं गलत क्या कर रहा करने के लिए किसी भी संकेत दिए गए बहुत अच्छा होगा :)

+1

आप के रूप में अपनी तस्वीरों सरणी घोषित हैं: '[ModelAttachment]', आप का उपयोग करने के लिए सक्षम होना चाहिए लूप के लिए। – keithbhunter

उत्तर

56

खोलना और, सही प्रकार के लिए वस्तुओं खिन्न सुरक्षित रूप से, if let साथ, befor ई एक सरल for in पाश के साथ पुनरावृत्ति कर रहा है।

if let currentUser = currentUser, 
    let photos = currentUser.photos as? [ModelAttachment] 
{ 
    for object in photos { 
     let url = object.url 
    } 
} 

वहाँ भी guard let else बजाय if let यदि आप परिणाम दायरे में उपलब्ध होने पसंद करते हैं:

guard let currentUser = currentUser, 
    let photos = currentUser.photos as? [ModelAttachment] else 
{ 
    // break or return 
} 
// now 'photos' is available outside the guard 
for object in photos { 
    let url = object.url 
} 
+1

का उपयोग करें धन्यवाद!अंत में यह आपके कोड को इस तरह संशोधित करके काम करता है: 'उपयोगकर्ता में ऑब्जेक्ट के लिए फोटो! [मॉडल एटैचमेंट] के रूप में ' –

+0

आप बस 'उपयोगकर्ता में ऑब्जेक्ट के लिए' लिख सकते हैं! और यह काम करेगा। लेकिन यह वैकल्पिक प्रकार के उद्देश्य को हरा देता है। –

4

आप सिंटैक्स में सरल एनएसएआरएआर का उपयोग करने की कोशिश कर सकते हैं ताकि छोटे कोड के लिए त्वरित रूप से सरणी में सरणी हो सके। निम्नलिखित मेरे लिए काम कर रहा है:

class ModelAttachment { 
    var id: String? 
    var url: String? 
    var thumb: String? 
} 

var modelAttachementObj = ModelAttachment() 
modelAttachementObj.id = "1" 
modelAttachementObj.url = "http://www.google.com" 
modelAttachementObj.thumb = "thumb" 

var imgs: Array<ModelAttachment> = [modelAttachementObj] 

for img in imgs { 
    let url = img.url 
    NSLog(url!) 
} 

See docs here

0

photos संपत्ति एक वैकल्पिक सरणी है और उसके तत्वों (समान तक पहुँचने के रूप में आप की count संपत्ति पाने के लिए क्या पहले unwrapped किया जाना चाहिए सरणी):

for var i = 0; i < userPhotos!.count ; ++i { 
    let url = userPhotos![i].url 
} 
+2

यह नहीं है कि यह स्विफ्ट – Gerald

+3

में कैसे किया जाता है यह पहले समर्थित था लेकिन स्विफ्ट 3.0 के बाद से इसे हटा दिया गया है। कृपया औपचारिक स्विफ्ट वाक्यविन्यास – achi

6

आपका userPhotos सरणी विकल्प टाइप है, तो आप ! के साथ वास्तविक अंतर्निहित वस्तु को पुनः प्राप्त करेगा (यदि आप यदि ऑब्जेक्ट नहीं है तो कोई त्रुटि चाहिए) या ? (यदि आप यूआरएल में nil प्राप्त करना चाहते हैं):

let userPhotos = currentUser?.photos 

for var i = 0; i < userPhotos!.count ; ++i { 
    let url = userPhotos![i].url 
} 

लेकिन सुरक्षित नहीं के बराबर से निपटने को बचाने के लिये, तो आप बेहतर कार्यात्मक दृष्टिकोण, उदाहरण के लिए, इस तरह का उपयोग map साथ:

let urls = userPhotos?.map{ $0.url } 
+0

मानचित्र का उपयोग करने पर अधिक http://useyourloaf.com/blog/swift-guide-to-map-filter-reduce/ – Leon

+1

ध्यान दें कि 'for ;;' वाक्यविन्यास अब स्विफ्ट 3 में मौजूद नहीं है –