2014-11-10 13 views
7

Ich habe ein wirklich seltsames Problem. Ich sortiere ein Array von NSDictionary-Objekten in meiner App, aber es funktioniert nur ordnungsgemäß, wenn die App von Xcode ausgeführt wird. Sobald ich die App vertreibe und & auf einem Gerät laufe, funktioniert die Sortierung nicht mehr.Swift Optimierungsstufe 'Schnellste' bricht die Sortierung des Arrays

Hier ist der Code kann in einem Spielplatz mit einigen Beispiel NSDictionary Objekte ausgeführt werden. Der Code in der App ist der gleiche.

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) 
} 

Wie Sie sehen können, funktioniert das Sortieren auf dem Spielplatz richtig. Weiß jemand, was könnte falsch sein?

aktualisieren

fand ich, dass die Swift Optimierungsstufe das Problem verursacht. Wenn Sie dies auf -O (Schnellste) setzen, wird die Sortierung fehlschlagen. Wenn Sie es auf -Onone (None) einstellen, wird die Sortierung ordnungsgemäß funktionieren.
Hat jemand irgendwelche Vorschläge, wie Sie den Code ändern, so dass es mit -O Optimierung funktioniert?

Update 2

ich einen Fehlerbericht bei Apple eingereicht haben. Zur Zeit benutze ich eine NSSet, um das Array zu sortieren, was gut zu funktionieren scheint.

Letztes Update

Ich habe nicht in der Lage gewesen, diese 6.1.1 da Xcode zu reproduzieren

+0

erleben das gleiche Problem im Moment – sachadso

+0

Welche Version von Xcode verwenden Sie? –

+0

Es ist XCode Beta 6.3 – sachadso

Antwort

1

Dies scheint nach unten auf Ihre Namenskonvention in Ihrem sortierten Verschluss zu sein. Wenn Sie (p1, p2) in andere Namen ändern, wird das Problem gelöst. Mit -Ofastest scheint der Compiler falsch zu 2 Dinge zu tun:

1) verursacht P1 und P2 innerhalb des Verschlusses auf die NSDictionarys selbst zu beziehen, anstatt die Schließung Parameter

2) Reinigung, die Verweise auf die NSDictionary Objekte vorzeitig, da # 1

ändern Sie den Code so der letzte Abschnitt zeigt:

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

Ich bin mir nicht sicher, ob Sie das ernst meinen, aber ich habe es trotzdem versucht. Es macht keinen Unterschied. –

Verwandte Themen