2015-02-08 16 views
5

Tôi cóGán một [String: AnyObject] tới [String: AnyObject] trong Swift thay thế dấu phẩy với dấu chấm phẩy

var params = [String:AnyObject]() 

Tôi có một chức năng mà trả về một [String:AnyObject]. Vì vậy, tôi muốn gán đến một chìa khóa của params như thế này:

params["phoneDetails"] = getPhoneDetails() 

Vấn đề tôi đang phải đối mặt là, sự trở lại của getPhoneDetails() khác với giá trị trong params["phoneDetails"].

Dưới đây là sản phẩm của getPhoneDetails()

[locale: en, ostype: 32bit, appversion: 4.0.0, architecture: x86, version: 8.1] 

Dưới đây là sản phẩm của params["phoneDetails"]:

Optional({ 
    appversion = "4.0.0"; 
    architecture = "x86 "; 
    locale = en; 
    ostype = 32bit; 
    version = "8.1"; 
}) 

Vì vậy, thay vì một dấu phẩy, tôi thấy một dấu chấm phẩy, khi sử dụng println(params["phoneDetails"]) .

Tôi muốn nó giống với kiểu trả về là getPhoneDetails. Tôi đang làm gì sai?

+0

Sản lượng định dạng cho println sau quy tắc riêng của mình. Nếu bạn muốn có một định dạng khác, bạn cần phải làm điều đó theo cách thủ công. –

+0

Đoán của tôi là getPhoneDetails() trả về một bộ không phải là một từ điển. Trường hợp nào getPhoneDetails() đến từ đâu? – Alex

+0

Tôi đã viết nó. Nó trả về một [String: AnyObject]. – Rishi

Trả lời

6

Lý do cho điều này là Swift được ngầm chuyển đổi của bạn Swift.Dictionary thành một NSDictionary:

let d: [String:AnyObject] = ["one":"1","two":"2"] 
// Swift.Dictionary implements Printable.description 
// (which println uses) as [key:value, key:value] 
d.description 

let nsd = d as NSDictionary 
// NSDictionary on the other hand, implements 
// it as {\n key = value;\n key = value;\n} 
nsd.description 

Lý do chuyển đổi này là việc bạn sử dụng AnyObject. Theo lý thuyết, AnyObject chỉ có thể lưu trữ các loại tham chiếu (ví dụ: các lớp học). Hãy thử như sau trong một sân chơi mà không cần bất kỳ câu lệnh import ở đầu ví dụ: loại bỏ import UIKit hoặc bất cứ điều gì:

// this won’t even compile - Strings aren’t classes, they’re structs 
// so you can’t assign them to AnyObject 
let d: [String:AnyObject] = ["one":"1","two":"2"] 

// this fixes that: 
let e: [String:String] = ["one":"1","two":"2"] 
// but this won’t compile: 
let o: AnyObject = e // [String:String] doesn’t conform to protocol AnyObject 

Nhưng import Foundation và đột nhiên kỳ diệu sẽ xảy ra. Hai bit của ma thuật trong thực tế: chuỗi literals bây giờ có thể tạo ra NSString đối tượng, đó là các lớp học và do đó, phù hợp với AnyObject. Và từ điển Swift có thể được chuyển đổi thành im lặng thành các đối tượng NSDictionary, cũng là các lớp để phù hợp với AnyObject. Cái thứ hai là những gì đang xảy ra với bạn, và vì vậy bạn có được một đầu ra khác, bởi vì kiểu của bạn thực sự là một kiểu khác.

Nếu bạn không muốn họ được các loại khác nhau, bạn có hai lựa chọn - trả về một NSDictionary từ getPhoneDetails chức năng của bạn (ick) hoặc ngừng sử dụng AnyObject và thay vào đó tuyên bố từ điển của bạn là loại [String:[String:String]] (yay, nhưng dẫn đến các loại và giá trị mạnh hơn chứ không phải là ngữ nghĩa tham chiếu, có thể có nghĩa là phải cấu trúc lại mã khác).

(hoặc tôi đoán bạn có thể chuyển sang [String:Any] nhưng có nằm điên rồ)

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