2016-01-19 13 views
6

मुझे JSON प्राप्त हो रहा है और मैं इसे मानने के लिए इसे पार्स करना चाहता हूं। मैं यहInt64 काम नहीं करता है जबकि Int

let ddd = oneJson["restaurantId"] as! Int 
print("ddd = \(ddd)") 
let restaurantId = oneJson["restaurantId"] as! Int64 

जैसा कि आप देखते हैं, मैं उसी क्षेत्र को पार्स कर रहा हूं। यहाँ मेरी JSON

"location":"location here location","restaurantId":0 

प्रिंट बयान बस ठीक काम करता है, लेकिन मुझे लगता है मैं, की सिफारिश करेंगे Int64 (या Int32) का उपयोग नहीं करने oneJson["restaurantId"] as! Int64

enter image description here

+0

मैं क्या इस समस्या का कारण है पता नहीं है (इसलिए है टिप्पणी), लेकिन '(एक जेसन [" रेस्टोरेंटआईडी "] के रूप में उपयोग करने का प्रयास करें! एनएसएसटींग)। लोंग लोंग वैल्यू ', जो' इंट 64' – Jojodmo

उत्तर

0

पर एक अपवाद मिलता है। Int ज्यादातर मामलों में काम करेगा।

स्विफ्ट में विभिन्न पूर्णांकों के बारे में इस पोस्ट देखें: https://stackoverflow.com/a/27440158/4687348

+0

प्रकार के साथ एक मूल्य देगा, लेकिन यह कोई जवाब नहीं है, मैं Int64 के लिए पूछ रहा हूं, और मुझे पता है कि मुझे इंट 64 की आवश्यकता क्यों नहीं है। – sarah

+0

यह अच्छी सलाह हो सकती है, लेकिन यह वास्तव में 'Int64' – Jojodmo

+0

में मान को बदलने की समस्या को हल नहीं करती है, मुझे लगता है कि' Int' या 'Int64' के बजाय 'स्ट्रिंग' का उपयोग करना बेहतर होगा, क्योंकि सिर्फ इसलिए जावास्क्रिप्ट Int64 के साथ अनुकूल नहीं है, जिसे 'जेएस' में छोटा कर दिया जाएगा। –

7

मैं में तेजी से (नहीं) इस मोड़ से प्यार है।

यह मुझे पता है कि भाषा की कम से कम सहज ज्ञान युक्त गॉथस में से एक है। तो यह पता चला है कि जब आप AnyObject, इन्ट्स, डबल्स, फ्लोट्स के साथ एक शब्दकोश प्राप्त करते हैं, तो स्विफ्ट देशी प्रकारों के रूप में संग्रहीत नहीं होते हैं। वे ... आश्चर्य के रूप में संग्रहीत कर रहे हैं! NSNumber।

जो अनजान व्यवहार के पूरे मेजबान की ओर जाता है, उदाहरण के लिए किसी भी ऑब्जेक्ट्स को जांचने के लिए टाइप करें कि आपके पास डबल या इंट है (यह नहीं किया जा सकता है)।

इसी कारण से, आपका कोड विफल हो रहा है। यह करने के लिए परिवर्तित करें:

let ddd = oneJson["restaurantId"] as! Int 
print("ddd = \(ddd)") 
let restaurantId = (oneJson["restaurantId"] as? NSNumber)?.longLongValue 

और बार-बार अपने आप को याद दिलाना है कि जब यह एक AnyObject आप से, स्विफ्ट आप से तथ्य यह है कि यह स्विफ्ट आधार प्रकार के लिए NSNumber से एक डाली करता है छिपा है, कास्टिंग कर रहे हैं और कि में है सच, वे अभी भी सिर्फ NSNumbers हैं।

+0

एक तरफ के रूप में, आपको अपने JSON लाइब्रेरी पर भरोसा करना होगा ताकि यह इनपुट 64 को इंट 64 के रूप में ठीक से पढ़ सके, या फिर आप परिशुद्धता खो सकते हैं। मैंने कभी इसका परीक्षण नहीं किया है, और आपने अपना कार्यान्वयन विवरण नहीं देखा है, लेकिन यह निश्चित रूप से परीक्षण के लायक है। – tbondwilkinson

0

हाँ, यह स्विफ्ट 3 में एक ज्ञात बग, जो स्विफ्ट में हल किया गया है 4.
अब, तुम सिर्फ इस तरह लिखते हैं,

let n = NSNumber.init(value: 9223372036854775807) // 2^63 - 1 
print(n, n as! Int64) // will print the right answer. 
संबंधित मुद्दे