2014-11-08 12 views
7

Tôi đang sử dụng __DATE____TIME__ trong Mục tiêu-C để nhận ngày và giờ xây dựng ứng dụng của tôi. Tôi không thể tìm cách để lấy thông tin này trong Swift. Có thể không?Nhận ngày và giờ xây dựng trong Swift

+0

Có rất nhiều điều bạn không thể nói trong Swift. Không phải vấn đề lớn. Sử dụng một lớp trợ giúp được viết trong Objective-C ... – matt

Trả lời

8

Bạn có thể sử dụng #line, #column#function.


Original câu trả lời:

Tạo một file Objective-C mới trong dự án của bạn, và khi Xcode hỏi, nói có với tạo header cầu nối.

Trong file Objective-C mới này, bổ sung sau khi các .h file:

NSString *compileDate(); 
NSString *compileTime(); 

Và trong .m thực hiện các chức năng:

NSString *compileDate() { 
    return [NSString stringWithUTF8String:__DATE__]; 
} 

NSString *compileTime() { 
    return [NSString stringWithUTF8String:__TIME__]; 
} 

Bây giờ chuyển đến tiêu đề bridging và nhập khẩu các .h chúng tôi tạo ra.

Bây giờ trở lại bất kỳ các tập tin Swift của bạn:

println(compileDate() + ", " + compileTime()) 
+0

Tuyệt vời. Cảm ơn nhgrif. –

+0

Như một lưu ý, rất tiếc là không có cách nào mà tôi biết sử dụng chính xác '__LINE__' hoặc' __FILE__' trong Swift. Cách tiếp cận tương tự này sẽ chỉ trả lại dòng/tệp của mã Objective-C, rõ ràng. – nhgrif

+1

Thực ra, có một cách. Kiểm tra bài đăng này từ Apple: https://developer.apple.com/swift/blog/?id=15 –

17

Bạn có thể lấy ngày xây dựng và thời gian không quay trở lại mục tiêu-C. Khi ứng dụng được tạo, tệp Info.plist được đặt trong gói luôn được tạo từ gói trong dự án của bạn. Vì vậy, ngày tạo của tệp đó khớp với ngày và giờ xây dựng. Bạn luôn có thể đọc các tệp trong gói ứng dụng của bạn và nhận các thuộc tính của chúng. Vì vậy, bạn có thể nhận được từ ngày xây dựng trong Swift bằng cách truy cập tập tin Info.plist của nó thuộc tính:

var buildDate:NSDate 
{ 
    if let infoPath = NSBundle.mainBundle().pathForResource("Info.plist", ofType: nil), 
     let infoAttr = try? NSFileManager.defaultManager().attributesOfItemAtPath(infoPath), 
     let infoDate = infoAttr["NSFileCreationDate"] as? NSDate 
    { return infoDate } 
    return NSDate() 
} 

Lưu ý: đây là bài mà tôi đã sử dụng các tiêu đề lấp khi tôi bước đầu có vấn đề này. Tôi tìm thấy giải pháp "Swiftier" kể từ đó vì vậy tôi nghĩ rằng tôi muốn chia sẻ nó để tham khảo trong tương lai.

[EDIT] đã thêm biến compileDate để nhận ngày biên dịch mới nhất ngay cả khi không thực hiện xây dựng đầy đủ. Điều này chỉ có ý nghĩa trong quá trình phát triển vì bạn sẽ phải thực hiện một bản dựng đầy đủ để phát hành ứng dụng trên kho ứng dụng nhưng nó vẫn có thể được sử dụng. Nó hoạt động theo cùng một cách nhưng sử dụng tệp được gộp có chứa mã thực tế thay vì tệp Info.plist.

var compileDate:Date 
{ 
    let bundleName = Bundle.main.infoDictionary!["CFBundleName"] as? String ?? "Info.plist" 
    if let infoPath = Bundle.main.path(forResource: bundleName, ofType: nil), 
     let infoAttr = try? FileManager.default.attributesOfItem(atPath: infoPath), 
     let infoDate = infoAttr[FileAttributeKey.creationDate] as? Date 
    { return infoDate } 
    return Date() 
} 
+0

Điều này không mang lại kết quả nhất quán với '__DATE__' kể từ khi bạn cập nhật thông tin ứng dụng của mình.plist sẽ vẫn giữ nguyên trong khi' __DATE__' được cập nhật đúng vào thời điểm cập nhật. –

+0

Tôi phỏng đoán rằng OP đang tìm kiếm ngày và giờ xây dựng. Tôi không chắc chắn ý của bạn là "khi bạn cập nhật ứng dụng". Bạn đang xây dựng lại nó, điều này sẽ luôn thay đổi ngày tạo của info.plist hoặc bạn không xây dựng lại nó và ngày sẽ không thay đổi (như mong đợi). –

+0

Vâng, tôi có nghĩa là xây dựng lại. Vấn đề là nếu bạn đi để xây dựng lại đơn giản thông qua Xcode nó sẽ xuất ra cùng một thời điểm như trước đây. Đi sản phẩm> Sạch sẽ buộc phải cập nhật Info.plist. Bạn có thể xác nhận điều đó không? –

Các vấn đề liên quan