elapsedTime
की गणना करने का आपका प्रयास गलत है। स्विफ्ट 3 में, यह होगा:
let elapsed = Date().timeIntervalSince(timeAtPress)
नोट ()
Date
संदर्भ के बाद। Date()
एक नई दिनांक वस्तु को तुरंत चालू करता है, और उसके बाद timeIntervalSince
उस और timeAtPress
के बीच का समय अंतर देता है। वह एक फ्लोटिंग पॉइंट वैल्यू (तकनीकी रूप से, TimeInterval
) लौटाएगा।
यदि आप चाहते हैं कि के रूप में एक Int
मूल्य तक छोटा कर दिया, तो आप सिर्फ उपयोग कर सकते हैं:
let duration = Int(elapsed)
और, Btw, timeAtPress
चर की अपनी परिभाषा एक Date
वस्तु का दृष्टांत की जरूरत नहीं है। मुझे लगता है आप का इरादा:
var timeAtPress: Date!
यह एक Date
चर के रूप में चर (एक परोक्ष एक unwrapped) को परिभाषित करता है, लेकिन आप शायद उस चर की वास्तविक इन्स्टेन्शियशन स्थगित चाहते हैं जब तक 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
का उपयोग करता है, लेकिन इसकी जटिलताओं Technical Q&A QA1398 में उल्लिखित में से कुछ बचा जाता है।
याद रखें, हालांकि, CACurrentMediaTime
/mach_absolute_time
डिवाइस रीबूट होने पर रीसेट हो जाएगा। तो, नीचे की रेखा, यदि आपको ऐप चलने के दौरान सटीक समयबद्ध गणना की आवश्यकता है, तो CACurrentMediaTime
का उपयोग करें। लेकिन यदि आप इस स्टार्ट टाइम को लगातार स्टोरेज में सहेजने जा रहे हैं, जिसे आपको कुछ भविष्य की तारीख में रीस्टार्ट होने पर याद किया जा सकता है, तो आपको Date
या CFAbsoluteTimeGetCurrent
का उपयोग करना होगा, और केवल किसी भी गलतफहमी के साथ रहना होगा।
वाह, धन्यवाद रोब! आपका जवाब बेहद सहायक और समझने में आसान था। मैं वास्तव में CFAbsoluteTime के बारे में टिप की सराहना करता हूं। मैं निश्चित रूप से इसका उपयोग करूंगा! – Erik
समय के लिए आयाम क्या है अंतरालसेन्सडेट? – eugene
यह एक ['NSTimeInterval'] (https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_DataTypes/index.html#//apple_ref/c/tdef/NSTimeInterval) देता है , जिसे सेकंड की संख्या के रूप में मापा जाता है। – Rob