2014-06-08 19 views
7

ayrıştırılırken 'AnyObject'den aşağıya yayınlanamıyor' varolan bir projeyi Swift'e aktarmaya çalışırken, daha çok bir öğrenme alıştırması yapmaktayım ama bence oldukça basit bir sorun var. Benim AnyObject anlayışımla ilgili olmadığını düşünüyorum.JSON dizilimi

Ben bir dizi değişkene oluşur ve olarak başlatıldığını • Bir nesneyi oluşturduk: Sonra JSON veri almak için NSURLConnection kullanıyorum

var customObject:MycustomObject = MYcustomObject() 

ve bu her jsonArray olarak düzgün çalışıyor gibi görünüyor sonra dizide döngü ve veri ayrıştırmak çalışılıyor verilere

jsonArray = NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: &error) as NSArray 

doldurulur ve sorunlar yaşıyorum burada bu AnyObject için döngü varsayılan detaylar için, niteliğinde değildir.

for details:AnyObject in jsonArray { 
    parseDetail(details as NSDictionary) 
} 

sorun TamsayıDeğer ilgilidir onun bir hata

func parseDetail(element: NSDictionary) { 
     self.customObject.stringValue  = element["id"] as String 
     self.customObject.integerValue  = element["type"] as Integer 
} 

da görünüyor " 'AnyObject' dan @ objc .... olmayan hiç mahzun Can not" bazı farklılıklar olması üreten NSString & Dize çalışıyoruz, şu ana kadarki anlayışım, Swift'i kullanırken, Sting, Float Integer vb. yerel türlerini kullanmalıyım. NSString kullanırsam, stringValue hata ayıklama penceresinde doğru görüntüleniyor, ancak dize I türünü kullanırken aşağıdakileri edinin:

{ 
    core = { 
    _baseAddress = Builtin.RawPointer = 0x0b227f49 
    _countAndFlags = 1073741828 
    _owner = Some { 
     Some = (instance_type = Builtin.RawPointer = 0x0b227f40 -> 0x006d58f0 (void *)0x006d58c8:   __NSCFString) 
    } 
    } 
} 

Üzgünüm, bu biraz uzun ama iş parçacığı hakkında bir bilgi var mı?

NSThread.detachNewThreadSelector(Selector: parseDetail(), toTarget: self, withObject: nil) 
+0

neden bir nsarry yerine hızlı bir dizi kullanıyorsunuz? – connor

+0

Döngüde tip belirtmediniz mi? (Yani, 'jsonArray'daki ayrıntılar için) – Jiaaro

+0

İlk soruya verilen yanıt bu makalede ele alınmıştır: [Kakao Veri Türleriyle Çalışma - Diziler] (https://developer.apple.com/library/prerelease/ios/documentation/ Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html) İkinci soruya gelince, [arama] (https://developer.apple.com/library/prerelease/ios/search/?q=detachNewThreadSelector) yalnızca ilgili belgeleri değil, Ayrıca, bu yöntemi kullanan uygulamaları da örnekleme. –

cevap

10

İşte bu, işi yapan küçük bir örnektir. İlk olarak, burada bizim amacımız için bir model sınıfı var: Gördüğünüz gibi

class CustomObject { 
    var name: String = "" 
    var age : Int = 0 

    init(json: Dictionary<String, AnyObject>) { 
     name = json["name"] as NSString 
     age = (json["age" ] as NSNumber).integerValue 
    } 
} 

, hala henüz Swift türleri güncellendi değildir NSJSONSerialization beri NSNumbers ve NSStrings ile uğraşmak gerekir.

Sonraki, projemize ikamet eden küçük json.txt dosyası:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool { 
    var filePath = NSBundle.mainBundle().pathForResource("json", ofType:"txt") 
    var data  = NSData(contentsOfFile:filePath) 
    var json  = NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: nil) as Array<Dictionary<String, AnyObject>> 

    var customObjects = json.map { dict in CustomObject(json: dict) } 

    println(customObjects[0].name) 
    println(customObjects[0].age) 

    return true 
} 

Bu yazdırır: sağ hızlı bir test için uygulama başlatma

[{"name":"Alice","age":30},{"name":"Bob","age":40}] 

Ve son ayrıştırıcı,:

Alice 
30 
+0

MutableContainers seçeneğini neden kullanıyorsunuz? OP'nin amacına uygun olarak – joerick

+1

@joerick. –

0

bir ilerleme güncelleme, aşağıdaki öğelerin doğru ve çalışıyoruz:

.interegervalue 
.doublevalue 
.boolvalue 

Yukarıdakilerin neden çalışmadığı görülüyor olmasının nedeni, JSON verilerinin değişmiş olması ve bazı elementlerin artık mevcut olmamasıdır. Öyleyse, [] type []] öğesi yoktu, Swift'i kullanarak bu bir kazada sonuçlanırken Objective-C'de herhangi bir kilitlenme meydana gelmez.

öğrenme sürecinin tüm bölüm ..

+0

Aboneliği kullanarak bir sözlüğün öğesine erişme, isteğe bağlı bir değer döndürdüğü için çöküyor. JSON verilerinin belirli bir anahtar içermediği durumlar için muhtemelen aşağıdakileri yapmak istersiniz: 'code' , id = element [" id "] 'i değiştirilsin mi? Dize { self.customObject.stringValue = kimlik } – mbeaty