2015-06-02 9 views
24

Sto tentando di accedere all'URL di un oggetto archiviato in un array, ma sto ricevendo errori, non importa quali metodi sto usando.Come eseguire il ciclo di una serie di oggetti in rapido

let userPhotos = currentUser?.photos 

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

Qui ho

Impossibile trovare membro 'url'

e con un foreach:

for photo in userPhotos { 

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

     }) 
    } 

ottengo:

'[ModelAttachment]?' non ha un membro denominato 'Generator'

La mia matrice è var photos: Array<ModelAttachment>? e la mia ModelAttachment assomiglia a questo:

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

Eventuali riferimenti a quello che sto facendo male sarebbe bello :)

+1

Se dichiarate la vostra foto array come: '[ModelAttachment]', si dovrebbe essere in grado di utilizzare i cicli for. – keithbhunter

risposta

56

Unwrap e abbattuto gli oggetti al tipo giusto, in modo sicuro, con if let, befor Fare l'iterazione con un semplice ciclo for in.

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

C'è anche guard let else invece di if let se si preferisce avere il risultato disponibile nel campo di applicazione:

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

Grazie!Alla fine funziona modificando il tuo codice in questo modo: 'per oggetto in userPhotos! come [ModelAttachment] ' –

+0

Puoi scrivere semplicemente' per oggetto in userPhotos! 'e funzionerà. Ma sconfigge lo scopo dei tipi opzionali. –

4

Si può provare a utilizzare il semplice NSArray nella sintassi per l'iterazione sull'array in swift che rende il codice più breve. Il seguente sta lavorando per me:

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

La proprietà photos è un optional serie e devono essere da scartare prima di accedere i suoi elementi (lo stesso che si fa per ottenere la proprietà count del array):

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

questo non è il modo in cui è stato eseguito in swift – Gerald

+3

Questo è stato supportato in precedenza ma è stato ritirato da Swift 3.0. Si prega di utilizzare la sintassi formale Swift – achi

6

Il nuovo array userPhotos è l'opzione tipizzato, si dovrebbe recuperare l'oggetto sottostante vero e proprio con ! (se si vuoi un errore nel caso in cui l'oggetto non ci sia) o ? (se desideri ricevere nil nell'URL):

let userPhotos = currentUser?.photos 

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

Ma per preservare la manipolazione nil sicura, è meglio utilizzare approccio funzionale, per esempio, con map, in questo modo:

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

Ulteriori informazioni sull'uso della mappa http://useyourloaf.com/blog/swift-guide-to-map-filter-reduce/ – Leon

+1

nota che la sintassi 'for ;;' non esiste più in Swift 3 –

Problemi correlati