2014-11-10 9 views
7

Ho un problema davvero strano. Sto ordinando una serie di oggetti NSDictionary nella mia app, ma funziona correttamente solo quando l'app è in esecuzione da Xcode. Non appena distribuisco l'app e installo & eseguendolo su un dispositivo, l'ordinamento non funziona più.Livello di ottimizzazione rapido 'Più veloce' interrompe l'ordinamento dell'array

Ecco il codice può essere eseguito in un parco giochi, con alcuni oggetti NSDictionary esempio. Il codice nell'app è lo stesso.

import UIKit 

let p1 = NSDictionary(objects: ["Zoe", 32], forKeys: ["name", "age"]) 
let p2 = NSDictionary(objects: ["Adrian", 54], forKeys: ["name", "age"]) 
let p3 = NSDictionary(objects: ["Jeff", 23], forKeys: ["name", "age"]) 
let p4 = NSDictionary(objects: ["", 66], forKeys: ["name", "age"]) 
let p5 = NSDictionary(objects: [23], forKeys: ["age"]) 

let persons = [p1,p2,p3,p4,p5] 

let sortedPersons = persons.sorted { (p1, p2) -> Bool in 
    (p2["name"] as? String) > (p1["name"] as? String) 
} 

Come si può vedere, l'ordinamento nel parco giochi funziona correttamente. Qualcuno sa cosa potrebbe essere sbagliato?

Aggiornamento

Ho trovato che l'ottimizzazione livello Swift è la causa del problema. Impostando questo su -O (Più veloce), l'ordinamento fallirà. Impostandolo su -Onone (Nessuno), l'ordinamento funzionerà correttamente.
Qualcuno ha qualche suggerimento su come cambiare il codice, quindi funzionerà con l'ottimizzazione -O?

Update 2

ho presentato una segnalazione di bug di Apple. Per il momento sto usando un NSSet per ordinare l'array, che sembra funzionare bene.

Ultimo aggiornamento

non sono stato in grado di riprodurre questo dato Xcode 6.1.1

+0

con lo stesso problema al momento – sachadso

+0

Quale versione di Xcode stai usando? –

+0

E 'XCode Beta 6.3 – sachadso

risposta

1

Questo sembra essere giù al vostro convenzione di denominazione all'interno del vostro chiusura ordinata. Cambiare (p1, p2) con nomi diversi lo risolverà. Con -Ofastest, il compilatore sembra fare in modo non corretto 2 cose:

1) causando P1 e P2 entro la chiusura per riferirsi alle NSDictionarys stessi piuttosto che la chiusura parametri

2) Pulizia i riferimenti al NSDictionary oggetti prematuramente, dato # 1

Modificare il codice in modo da l'ultima sezione mostra:

let sortedPersons = persons.sorted { (d1, d2) -> Bool in 
    (d2["name"] as? String) > (d1["name"] as? String) 
} 
+3

Non sono sicuro che tu sia serio riguardo a questo, ma ci ho provato lo stesso. Non fa alcuna differenza. –

Problemi correlati