2016-02-06 41 views
6

Mã đang hoạt động, nhưng làm cách nào để tắt tiếng cảnh báo này luôn xuất hiện mỗi lần?truyền từ [String: AnyObject] sang loại không liên quan NSMutableDictionary luôn không thành công Cảnh báo

let parentView = self.parentViewController as! SBProfileViewController 
parentView.savedDetailsModel = SBSavedUserModel(data:responseObject["data"].dictionaryObject! as! NSMutableDictionary) 

cast từ '[String: AnyObject]' để loại không liên quan 'NSMutableDictionary' luôn luôn thất bại Warning

cửa hàng SavedUserModel lưu thông tin: -

class SBSavedUserModel : NSObject { 
var userId : String! 
var firstName : String! 
var lastName : String! 
var imageBase64 : String! 

required init (data : NSMutableDictionary) { 
    self.userId = data.objectForKey("userId") as! String 
    self.firstName = data.objectForKey("fName") as! String 
    self.lastName = data.objectForKey("lName") as! String 
    self.imageBase64 = data.objectForKey("image") as! String 
} 
+0

Tại sao bạn muốn từ điển của mình có thể thay đổi được? – Tommy

+0

Bởi vì nội dung của từ điển có thể thay đổi khi chạy. Vì người dùng có thể thay đổi/chỉnh sửa chi tiết bất kỳ số lần nào. @Tommy – Jitendra

+0

Mã bạn đã cung cấp cho chúng tôi tra cứu bốn mục từ từ điển và sau đó không bao giờ sử dụng lại nó. – Tommy

Trả lời

4

Hãy thử thay thế

responseObject["data"].dictionaryObject! as! NSMutableDictionary

với điều này:

NSMutableDictionary(dictionary: responseObject["data"].dictionaryObject!)

Bạn có thể dễ dàng quăng nó vào một NSDictionary, nhưng đối với một số lý do khi bạn muốn có một NSMutableDictionary, bạn phải khởi tạo một cái mới với NSMutableDictionary(dictionary:)

Sửa : xem nhận xét về câu hỏi này bởi @Tommy vì lý do tại sao điều này là cần thiết.

+0

Tuyệt vời Nó hoạt động !! :) @addison – Jitendra

+0

Tuyệt vời! Hãy nhớ chọn câu trả lời này làm câu trả lời được chấp nhận :) – Addison

+1

"Vì một lý do nào đó" là bạn bắt đầu với một từ điển bất biến. Nó không phải là kỳ lạ mà ngôn ngữ sẽ không cho phép bạn cố gắng để biến nó. "Đối tượng này là không thay đổi" không có nghĩa là "đối tượng này yêu cầu cú pháp phức tạp hơn một chút để thay đổi". – Tommy

2

Không giống như NSArrayNSDictionary mutable Foundation loại bộ sưu tập NSMutableArrayNSMutableDictionary không được bắc cầu với các đối tác Swift.

Giải pháp đơn giản nhất là tiếp tục sử dụng Swift loại bản địa

let parentView = self.parentViewController as! SBProfileViewController 
parentView.savedDetailsModel = SBSavedUserModel(data:responseObject["data"].dictionaryObject!) 

... 

class SBSavedUserModel : NSObject { 
var userId, firstName, lastName, imageBase64 : String 

    required init (data : [String:AnyObject]) { 
    self.userId = data["userId"] as! String 
    self.firstName = data["fName"] as! String 
    self.lastName = data["lName"] as! String 
    self.imageBase64 = data["image"] as! String 
    } 
} 

Hoặc - vẫn thuận tiện hơn nếu tất cả giá trị trong từ điển là chuỗi

parentView.savedDetailsModel = SBSavedUserModel(data:responseObject["data"].dictionaryObject as! [String:String]) 

... 

required init (data : [String:String]) { 
    self.userId = data["userId"]! 
    self.firstName = data["fName"]! 
    self.lastName = data["lName"]! 
    self.imageBase64 = data["image"]! 
} 
+0

Giải pháp là chính xác tuy nhiên vì một số lý do tôi đang sử dụng NSMutableDictionary cho các đối tượng có thể thay đổi. Các kiểu gốc Swift luôn là lựa chọn tốt nhất nếu chúng ta lập trình nhanh chóng. – Jitendra

-1

Hope theo cách này có thể trợ giúp bạn: mutableDictionary as NSDictionary as? [String: AnyObject] cách tương tự hoạt động trên NSMutableArray.

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