2014-11-24 20 views
8

Bir Objective-C eğitimini takip ediyorum ve öğretmen bir NSDate nesnesine bir NSTimeInterval nesnesi atabiliyor.SWIFT NSTimeInteval'i NSDate dönüştürün

Ders, CoreData'yı kullanır ve bir gönderinin tarihini bir NSTimeInterval olarak kaydeder, daha sonra bu aralığı almak ve UITableVIewController'da bölüm başlığı olarak sunmak üzere biçimlendirilmiş bir tarih dizesi olarak ayarlamak istiyoruz.

class DiaryEntry: NSManagedObject { 

@NSManaged var date: NSTimeInterval 
@NSManaged var body: String 
@NSManaged var imageData: NSData 
@NSManaged var mood: Int16 
@NSManaged var location: String 

func sectionName() -> String { 
    let date = NSDate().dateByAddingTimeInterval(self.date) 
    let f = NSDateFormatter() 
    f.dateFormat = "MMM yyy" 

    return f.stringFromDate(date) 
} 

} 

hattıyla Esas endişe:

şu anda aslında geçerli tarih üzerine ayarlanan tarih ekliyor
let date:NSDate = NSDate().dateByAddingTimeInterval(self.date) 

ve bu istediğim davranış değildir.

self.date değişkenini SWIFT içinde NSDate nesnesine nasıl yapabilirim?

cevap

15

NSTimeInterval alır NSDate bir initializer vardır:

init(timeIntervalSinceReferenceDate ti: NSTimeInterval) 

Dolayısıyla, sadece yapın:

var date = NSDate(timeIntervalSinceReferenceDate: 123) 
+0

Teşekkürler Peter, bir sebepten dolayı XCode'un intellisense'i yanıt vermiyor, kurucuyu ilk açtığımda bu seçenekleri görmedim. – Alex

+0

@Alex * gerekmez * intellisense. :) – Lance

+0

@Lance Muhtemelen daha iyi biliyordum, ama daha yeni başladım - kendimi dokümanlar ile kendimi sulamak zorundayım;) – Alex

2

Bu kod gerçekten karıştı.

Bir zaman aralığı bir tarih değil. Tarih bir zaman noktasıdır. Zaman aralığı, iki nokta arasındaki zaman farkıdır. Bir zaman aralığınız olduğunda, "iki tarih arasındaki saniye sayısıdır?" Sorusuna sahip olursunuz. NSDate() 'e bir veritabanında depolanan bir zaman aralığının eklenmesinin, yararlı bir sonuç vermesi olası değildir. 10 saniye sonra yapılan çağrı farklı bir tarih verecektir.

Gönderi tarihi büyük olasılıkla bir NSDate nesnesi olarak saklanmalıdır .. Çekirdek Veriler NSDate nesnelerini çok iyi bir şekilde ele alır.Eğer zaman aralıklarını saklamak istiyorsanız, tarih Bazı sabit referans tarihlerinden bu yana bir zaman aralığına dönüştürülmelidir, örneğin bunu "timeIntervalSinceReferenceDate" kullanarak yaparsınız. Bunu yaparsanız, "date" değişkenini çağırmamanızı öneririm ancak "secondsSinceReferenceDate" gibi bir şey Bir tarih verildiğinde ne saklanacağını ve bu sayıyı bir NSDate'e nasıl dönüştürebileceğinizi açık bir şekilde gösterir.

("secondsSinceReferenceDate" olarak adlandırılmasının nedeni, milisaniye veya nanosaniye depolamaya çalışan birçok kodun bulunması ve çağlardan bu yana aralıklarla saklanan birçok kodun bulunmasıdır (Jan 1 1970). Birisi kodunuzu okuyorsa, hemen sadece değişken ismine bakarak sayıların ne anlama geldiğini bilir.

+0

Teşekkürler gnasher. Ben de takip ettiğim öğreticinin yazarı niçin ikisini de seçmediği konusunda kafam karışmıştı, asla akıl yürütme konusunu açıklığa kavuşturmamıştı, ama hızlı ve özlü verilerde ilk defa olduğum için, belki de bir yararın olacağını düşündüm. şüphelerimi temizlemek için – Alex