2015-09-24 17 views
11

Gần đây tôi cập nhật Xcode lên 7 và nó chứa trình biên dịch nhanh 2.0. Trước khi tôi thực hiện dự án của tôi với phiên bản cũ của swift. Trong phiên bản mà tôi đã tạo NSMutableDictionary như dưới đâyCách tạo NSMutableDictionary trong swift 2.0

let dictParams:NSMutableDictionary? = ["test" : "test", 
     "username" : txtEmail.text, 
     "password" : txtPassword.text, 
     "version" : "1.0", 
     "appId" : "1", 
     "deviceId" : "fasdfasdfrqwe2345sdgdfe56gsdfgsdfg" 
    ]; 

trong mã trên txtEmail.texttxtPassword.text là lĩnh vực văn bản của tôi và điền tha giá trị tại thời gian chạy.

Mã này được đúng làm việc trong phiên bản cũ của nhanh chóng nhưng sau khi cập nhật nhanh chóng 2.0 nó mang lại cho tôi một lỗi như dưới đây

Cannot convert value of type '[String : String?]' to specified type 'NSMutableDictionary?' 

gì sai với nó xin vui lòng hướng dẫn cho tôi.

+1

* Gợi ý: * Câu hỏi đặt ra đánh dấu trong '[String: String?]' là có liên quan. Loại nào có 'txtEmail.text'? –

+0

Bạn có chắc là bạn cần một NSMutableDictionary? Tại sao không sử dụng từ điển Swift gốc? –

+1

TxEmail.text hoặc txtPassword.text, chúng có phải là giá trị tùy chọn không? Nếu vậy, bạn có phiền không cởi mở chúng và kiểm tra xem lỗi vẫn tồn tại. – iamyogish

Trả lời

17

Đơn giản chỉ cần bằng cách mở NSMutableDictionary hoặc NSDictionary giao diện lớp từ Xcode 7, bạn có thể dễ dàng thấy rằng tiềm ẩn loại thực tế là [NSObject: AnyObject]. Điều đó có nghĩa là giá trị không được là nil.

giá trị văn bản Unwrapping như txtEmail.text! hoặc txtPassword.text! có thể trông ok và giúp bạn thoát khỏi các lỗi biên dịch, nhưng đó là một lựa chọn không tồi bởi vì về mặt kỹ thuật text tài sản của UITextField là tùy chọn và ứng dụng của bạn có thể sụp đổ trong trường hợp đó!

Làm điều này vì sự an toàn của bạn:

let dictParams: NSMutableDictionary? = ["test" : "test", 
    "username" : txtEmail.text ?? "", // Always use optional values carefully! 
    "password" : txtPassword.text ?? "", 
    "version" : "1.0", 
    "appId" : "1", 
    "deviceId" : "fasdfasdfrqwe2345sdgdfe56gsdfgsdfg" 
] 

Bằng cách này, trong trường hợp nó không quan trọng để sử dụng NSMutableDictionary, xin vui lòng xem xét sử dụng từ điển Swift như thế này:

var mutableDictionary = [String: AnyObject] 

// OR this if the value can be nil 
var mutableDictionary = [String: AnyObject?] 
+0

Thumbs up cho nhà điều hành null-coalesce '??' thay vì unwrapping với '!' – redent84

+0

Tốt khái niệm, cảm ơn nhiều ... :) –

0

txtEmail.text và/hoặc txtPassword.text đang trả lại tùy chọn, đó là lý do tại sao nó cho bạn biết thay đổi loại. Bạn có thể viết lại dict như một từ điển nhanh chóng (đó là những gì tôi muốn giới thiệu). Khi bạn làm như vậy, bạn có thể làm cho đối tượng tùy chọn hoặc để nguyên chỉ là String và loại bỏ chuỗi tùy chọn khi bạn tạo dict.

var optionalString: String? 

var someDict: [String: String?] = ["test": "test", "test1": optionalString] 
+0

Vâng đó cũng là một cách khác để thực hiện điều này nhưng tôi đã thay đổi nhỏ trong mã hiện tại và nó hoạt động. btw cảm ơn bạn đã cập nhật :) –

0

thay đổi đơn giản trong "username" : txtEmail.text! thay "username" : txtEmail.text đang

nên cuối cùng là như dưới đây

let dictParams:NSMutableDictionary? = ["test" : "test", 
     "username" : txtEmail.text!,  //Add ! here 
     "password" : txtPassword.text!, //Add ! here 
     "version" : "1.0", 
     "appId" : "1", 
     "deviceId" : "fasdfasdfrqwe2345sdgdfe56gsdfgsdfg" 
    ]; 
+3

Bạn vừa chuyển đổi một lỗi biên dịch thành lỗi thời gian chạy, yay! – redent84

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