2015-04-16 16 views
7

Tôi cố gắng để chuyển đổi NSManagedObject để NSDictionary đây là những gì tôi đã cố gắng:Làm thế nào để chuyển đổi NSManagedObject để NSDictionary

var keys:NSArray = order?.entity.attributesByName.keys 
var dict:NSDictionary = order?.dictionaryWithValuesForKeys(keys) 

Nhưng tôi nhận được lỗi:

LazyForwardCollection<MapCollectionView<Dictionary<NSObject, 
AnyObject>, NSObject>>? is not convertible to NSArray. 

Tôi đang làm gì sai ở đây?

+0

Bạn có cần chính xác 'NSDictionary' hoặc nó là ok nếu bạn nhận được từ điển nhanh chóng? – ilya

+0

Tôi không biết. Mục tiêu của tôi là chuyển đổi từ điển đó thành chuỗi JSON. Vì vậy, nếu tôi có thể làm điều đó với từ điển tôi không có một vấn đề với điều đó. – 1110

Trả lời

14

Thuộc tính keys của từ điển trả về LazyForwardCollection phải được chuyển đổi thành một mảng thực.

Một vấn đề khác là order dường như là tùy chọn, vì vậy cần để được mở khóa, ví dụ: với tùy chọn ràng buộc.

if let theOrder = order { 
    let keys = Array(theOrder.entity.attributesByName.keys) 
    let dict = theOrder.dictionaryWithValuesForKeys(keys) 
} else { 
    // order is nil 
} 
+0

Điều này trả về cùng một lỗi – 1110

+0

@ 1110: Lạ, tôi đã làm việc cho tôi. –

+0

Tôi không biết. Tôi đang sử dụng nhanh chóng 1.2. Nó yêu cầu từ tôi để thêm tên tham số nhưng dòng thứ hai không thể vượt qua: 'let keys = Array (mảngLiteral: order? .entity.attributesByName.keys) let dict = order? .dictionaryWithValuesForKeys (keys)' – 1110

0

Thay vì nhận được các đối tượng ra khỏi cơ sở dữ liệu như NSManagedObject s, bạn có thể thiết lập các resultType, trên NSFetchRequest của bạn, để DictionaryResultType có Dictionaries trả lại khi bạn thực hiện theo yêu cầu.

Tuy nhiên, bạn sẽ không thể chỉnh sửa các giá trị trong các từ điển này và có các thay đổi được lưu trong cơ sở dữ liệu của mình. Nếu bạn chỉ cần đọc từ cơ sở dữ liệu của bạn, thì đó không phải là vấn đề.

0

Không thanh lịch nhưng điều này nên làm việc ...

var names = Array<String>() 
for attributeName in order?.entity.attributesByName.keys 
{ 
    names.append(attributeName as! String) 
} 

Đây là một vấn đề về việc chuyển đổi một số loại bộ sưu tập khác, đó là không bao giờ tầm thường ngay cả khi loại nội là như nhau.

chỉnh sửa: chút tinh thần nhanh chóng hơn

var names = map(order?.entity.attributesByName.keys){return $0 as! String} 
Các vấn đề liên quan