गणना करने का आपका प्रयास elapsedTimeगलत है। स्विफ्ट 3 में, यह होगा:
let elapsed = Date().timeIntervalSince(timeAtPress)
संदर्भ के ()बाद ध्यान दें Date। Date()एक नई तिथि वस्तु को दर्शाता है, और उसके बाद timeIntervalSinceकि और के बीच समय अंतर देता है timeAtPress। वह फ्लोटिंग पॉइंट वैल्यू (तकनीकी रूप से, a TimeInterval) लौटाएगा ।
यदि आप चाहते हैं कि Intमान को छोटा कर दिया जाए , तो आप इसका उपयोग कर सकते हैं:
let duration = Int(elapsed)
और, BTW, timeAtPressवैरिएबल की आपकी परिभाषा को किसी Dateऑब्जेक्ट को तुरंत करने की आवश्यकता नहीं है । मुझे लगता है कि आप का इरादा:
var timeAtPress: Date!
यह चर को एक चर के रूप में परिभाषित करता है Date(एक स्पष्ट रूप से अपरिवर्तित एक), लेकिन आप उस चर के वास्तविक तात्कालिकता को तब तक सुरक्षित रखेंगे जब तक pressedकि उसे बुलाया न जाए।
वैकल्पिक रूप से, मैं अक्सर उपयोग करता हूं CFAbsoluteTimeGetCurrent(), जैसे,
var start: CFAbsoluteTime!
और जब मैं सेट करना चाहता हूं startTime, तो मैं निम्नलिखित कार्य करता हूं:
start = CFAbsoluteTimeGetCurrent()
और जब मैं बीते हुए सेकंड की संख्या की गणना करना चाहता हूं, तो मैं निम्नलिखित करता हूं:
let elapsed = CFAbsoluteTimeGetCurrent() - start
यह ध्यान देने योग्य है कि CFAbsoluteTimeGetCurrentप्रलेखन हमें चेतावनी देता है:
इस फ़ंक्शन के लिए बार-बार कॉल करने से नीरस रूप से बढ़ते परिणामों की गारंटी नहीं मिलती है। बाहरी समय संदर्भों के साथ सिंक्रनाइज़ेशन या घड़ी के स्पष्ट उपयोगकर्ता परिवर्तन के कारण सिस्टम का समय घट सकता है।
इसका मतलब है कि यदि आप दुर्भाग्यपूर्ण समय को मापने के लिए पर्याप्त हैं, जब इनमें से एक समायोजन होता है, तो आप गलत बीते समय की गणना के साथ समाप्त हो सकते हैं। यह NSDate/ Dateगणना के लिए भी सही है। एक mach_absolute_timeआधारित गणना (सबसे आसानी से किया जाने वाला CACurrentMediaTime) का उपयोग करना सबसे सुरक्षित है :
let start = CACurrentMediaTime()
तथा
let elapsed = CACurrentMediaTime() - start
यह उपयोग करता है mach_absolute_time, लेकिन तकनीकी क्यू एंड ए QA1398 में उल्लिखित इसकी कुछ जटिलताओं से बचा जाता है ।
याद रखें, हालांकि, कि CACurrentMediaTime/ mach_absolute_timeजब डिवाइस रिबूट है रीसेट हो जाएगा। इसलिए, निचली रेखा, यदि आपको किसी ऐप के चलने के दौरान सटीक बीता हुआ समय गणना की आवश्यकता है, तो उपयोग करें CACurrentMediaTime। लेकिन अगर आप इस शुरुआती समय को लगातार स्टोरेज में सेव करने जा रहे हैं, जिसे आप भविष्य की तारीख में ऐप के फिर से शुरू होने पर याद कर सकते हैं, तो आपको इसका उपयोग करना होगा , Dateया CFAbsoluteTimeGetCurrentबस किसी भी तरह की अशुद्धि के साथ रहना होगा जो प्रवेश कर सकता है।