2014-11-10 12 views
7

Tôi có một vấn đề thực sự lạ. Tôi sắp xếp một mảng các đối tượng NSDictionary trong ứng dụng của tôi, nhưng nó chỉ hoạt động chính xác khi ứng dụng đang chạy từ Xcode. Ngay sau khi tôi phân phối ứng dụng và cài đặt & chạy ứng dụng trên thiết bị, việc sắp xếp không còn hoạt động nữa.Mức tối ưu hóa nhanh chóng 'Phân tách nhanh nhất' phân loại mảng

Đây là mã có thể chạy trong một sân chơi, với một số đối tượng ví dụ NSDictionary. Mã trong ứng dụng giống nhau.

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

Như bạn thấy, phân loại ở sân chơi không hoạt động chính xác. Có ai biết điều gì có thể sai không?

Cập nhật

tôi phát hiện ra rằng Swift Optimization Cấp gây ra vấn đề. Đặt cài đặt này thành -O (Nhanh nhất) sẽ khiến sắp xếp thất bại. Đặt nó thành -Onone (Không) sẽ làm cho sắp xếp hoạt động bình thường.
Có ai có bất kỳ đề xuất nào về cách thay đổi mã, do đó, nó sẽ hoạt động với tối ưu hóa -O?

Cập nhật 2

Tôi đã đệ trình một báo cáo lỗi tại Apple. Hiện tại, tôi đang sử dụng NSSet để sắp xếp mảng, có vẻ như hoạt động tốt.

Cập nhật lần cuối

tôi đã không thể tái sản xuất này kể từ Xcode 6.1.1

+0

Trải nghiệm cùng một vấn đề tại thời điểm – sachadso

+0

phiên bản nào của Xcode bạn đang sử dụng? –

+0

Đó là XCode Beta 6.3 – sachadso

Trả lời

1

này dường như là xuống đến quy ước đặt tên của bạn trong vòng đóng cửa sắp xếp của bạn. Thay đổi (p1, p2) thành các tên khác nhau sẽ giải quyết nó. Với -Ofastest, trình biên dịch có vẻ là làm sai 2 điều:

1) gây p1 và p2 trong việc đóng cửa để tham khảo các NSDictionarys bản thân chứ không phải là đóng cửa thông số

2) dọn dẹp các tham chiếu đến các NSDictionary đối tượng sớm, do # 1

Thay đổi mã nên phần cuối cùng cho thấy:

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

Tôi không chắc chắn nếu bạn nghiêm túc về điều này, nhưng tôi đã thử nó anyway. Nó không tạo ra bất kỳ sự khác biệt nào. –

Các vấn đề liên quan