2015-02-08 16 views
5

, virgül yerini alır. Yani, böyle params bir tuşa o atamak istiyorum:bir [AnyObject dize] atama [dize: AnyObject] Swift Bir <code>[String:AnyObject]</code> döndüren bir işleve sahip bir <pre><code>var params = [String:AnyObject]() </code></pre> <p></p> sahip yarı kolon

params["phoneDetails"] = getPhoneDetails() 

Ben is Karşılıklı sorun, getPhoneDetails() dönüş params["phoneDetails"] değeri farklıdır. println(params["phoneDetails"]) kullanırken, yarı-kolon, bkz virgül yerine Yani

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

: Burada

getPhoneDetails() burada

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

çıkışı params["phoneDetails"] çıkışı olan bir .

getPhoneDetails dönüş türüyle aynı olmasını istiyorum. Neyi yanlış yapıyorum?

+0

çıkışı kendi kurallarını takip eder. Farklı bir biçimlendirme istiyorsanız, bunu manuel olarak yapmanız gerekir. –

+0

Benim tahminim getPhoneDetails() bir demet değil sözlük döndüren olurdu. GetPhoneDetails() nereden geliyor? – Alex

+0

Onu yazdım. Bir [String: AnyObject] döndürür. – Rishi

cevap

6

Bunun nedeni Swift örtük dönüştürme olmasıdır sizin Swift.DictionaryNSDictionary bir içine:

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 

bu dönüşüm için bir neden AnyObject sizin kullanımıdır. Teorik olarak, AnyObject sadece referans türlerini (yani sınıfları) saklayabilir. import UIKit ya da her neyse kaldırmak yani üst herhangi ithalat ifadeleri olmadan bir oyun alanı aşağıdaki deneyin:

// 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 

Ama import Foundation ve aniden sihirli olur. Aslında iki bitlik sihir: string hazırlayıcıları artık NSString nesnesi oluşturabilir, bunlar sınıflar ve AnyObject ile uyumludur. Ve Swift sözlükleri sessizce da sınıflar yüzden AnyObject uygun olan NSDictionary nesneler, dönüştürülebilir. Bu sonuncusu size olan şeydir, ve böylece farklı bir çıktı elde edersiniz, çünkü tipiniz gerçekten farklı bir tiptir. senin getPhoneDetails fonksiyonu (Tran) bir NSDictionary iade veya AnyObject kullanmayı bırakın ve bunun yerine tip [String:[String:String]] (yay olması için sözlüğe bildirir ancak - bunları farklı türde olmak istemiyorsanız

, iki seçeneğiniz vardır Diğer sembölleri refactor yapmak zorunda kalabilecek referans semantiklerinden ziyade daha güçlü tip ve değerlere yol açar.

(yoksa seni [String:Any] geçmek sanırım ama delilik yatıyor) println için biçimlendirme

İlgili konular