iOS: Bu JSON sözlük nesne bir NSString olup olmadığını kontrol etmek iyi bir yol mu?

oy
0

Ben bir JSON nesnesi bir NSString olup olmadığını kontrol etmek ve eğer değilse, bunu bir varsayılan dize atamak. Benim nihai hedefi çökmesini önlemek ve ne olursa olsun vasıfları uygun değer atamak etmektir. Bu kullanıyorum bir veri modelinin bir örneğidir dict JSON Sözlüğü API döner olduğunu.

 Data *data = [[self alloc] init];
 data.name =  [NSString validateString:dict[@name] defaultString:@];
 data.status = [NSString validateString:dict[@status] defaultString:@OPEN];

İşte kategori yöntemidir validateStringkullanıyorum.

+ (NSString *)validateString:(NSString *)aString defaultString:(NSString *)defaultString {
    if ([aString isKindOfClass:[NSString class]]) {
        return aString;
    }
    return defaultString;
}
Oluştur 20/10/2018 saat 13:58
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
2

Bu döküm, hiçbir mantıklı ve çok kötü bir uygulamadır (NSString *)aStringve bu gerçeği bir NSString ise o zaman sorun.

Ayrıca, nil ise?

Eğer bir sözlükten getir zaman bildiğim bir olsun olmasıdır id. Bundan daha düşünmeyin.

Ben çok açık yazıyor öneririm: Ne demek istediğini söylemek ve ne demek istediğini. Bu Objective-C iyi uygulamadır. Aksi takdirde, dinamik yazarak ve "sıfır hile" ince hatalar sizi neden olabilir. Bu özel durumda herhangi bir sorun olmayabilir, ama kötü alışkanlıklar kötü alışkanlıkları vardır ve bunları ilk etapta meydana izin vermemeye en iyisidir. Böyle yeniden yazmak istiyorum:

+ (NSString *) checkType:(nullable id)obj defaultString:(NSString *)def {
    if (obj == nil || ![obj isKindOfClass:[NSString class]]) {
        return def;
    }
    return obj;
}
Cevap 20/10/2018 saat 14:55
kaynak kullanıcı

oy
0

Gibi diğer yorum olarak bahsedilen: Eğer çökmeleri önlemek istiyorsanız, siz de öyle olmadığını kontrol etmek gerekir nilgelecekte Swift kodunuzu bağlantı noktasına bir şans var, eğer özel.

Bile sadece benim son cümle netleştirmek için, çizgi aşağıda Objective-C çalışır aStringolduğunu nil:

if ([aString isKindOfClass:[NSString class]]) {

Yani bir şekilde Objective-C bir bir işlevini çağırarak, yapıldığı, çünkü var nilnesne döndürür nil, böylece ifdikkate alınacaktır falseve işlev dönecektir defaultString. Onlar objetive-C oluştururken bu hataların bir sürü yol açar beri Evet ... bu kesinlikle kötü bir fikirdir. Aşağıda böyle bir davranış hakkında daha fazla ayrıntı:

https://stackoverflow.com/a/2696909

Neyse, o da sadece türünü kontrol ettikten sonra bir nesne artığını iyi bir uygulamadır, bu yüzden bu şekilde fonksiyonu adapte öneriyoruz:

+ (NSString *)validateString:(id)obj defaultString:(NSString *)defaultString {
    if (obj != nil && [obj isKindOfClass:[NSString class]]) {
        return (NSString*)obj;
    }
    return defaultString;
}

Uygulayan her nesne NSObject*vardır isKindOfClass:(ve NSDictionary*uygulamak sadece mağaza nesneleri NSObject*), bu yüzden nesne kendisine tepki olmadığını kontrol etmek gerekmez. Ayrıca, istese bile respondsToSelector:aynı zamanda bir olan NSObject*işlevi.

Yine de, kullandığınız yöntemi hala çalışır. Yukarıda revize fonksiyon sadece daha iyi uygulamalara uyarlanır ve hiç bağlantı noktasına gelecekte Swift bu kodu (veya başka bir dil) ihtiyaç durumunda sorunlardan kaçınmak için.

DÜZENLEME: @ matt önerisi merkezli Güncelleme kodu.

Cevap 20/10/2018 saat 15:19
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more