गणना करने का आपका प्रयास 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
बस किसी भी तरह की अशुद्धि के साथ रहना होगा जो प्रवेश कर सकता है।