2016-09-14 22 views
1

感谢在这个论坛中的各种有用的帖子,我有一些代码可用于获取单个用户选择的NSURL的创建日期。但是,我无法让代码为硬编码的NSURL工作,也不能在通过NSFileManager枚举器的循环中工作。NSURL getResourceValue Swift 3

我不是专业程序员;我制作的应用程序是办公工具。我的最终目标是简单地根据创建日期对NSURL对象进行排序。

我使用的代码如下,它的功能就好了原样,但如果我尝试使用注释行,以评估特定的PDF文件时,我收到以下错误:

enter image description here

当我尝试将此代码添加到通过NSFileManager枚举器采购的NSURL对象循环中时,我得到了完全相同的错误。

我无法弄清楚如何使用错误指令来解决问题。如果有人能够提供帮助,那将是巨大的。谢谢。

let chosenURL = NSOpenPanel().selectFile 

    //let chosenURL = NSURL.fileURL(withPath: "/Users/craigsmith/Desktop/PDFRotator Introduction.pdf") 

    do 
    { 
     var cr:AnyObject? 
     try chosenURL?.getResourceValue(&cr, forKey: URLResourceKey.creationDateKey) 

     if (cr != nil) 
     { 
      if let createDate = cr as? NSDate 
      { 
       print("Seems to be a date: \(createDate)") 

       let theComparison = createDate.compare(NSDate() as Date) 

       print("Result of Comparison: \(theComparison)") // Useless 

       let interval = createDate.timeIntervalSinceNow 

       print("Interval: \(interval)") 

       if interval < (60*60*24*7*(-1)) 
       { 
        print("More than a week ago") 

       } 
       else 
       { 
        print("Less than a week ago") 
       } 
      } 
      else 
      { 
       print("Not a Date") 
      } 
     } 
    } 
    catch 
    { 

    } 

回答

8

可以扩展网址如下:

extension URL { 
    var creationDate: Date? { 
     return (try? resourceValues(forKeys: [.creationDateKey]))?.creationDate 
    } 
} 

用法:

print(yourURL.creationDate) 
+1

这很好用,但代码看起来和@OOPer发布的内容非常相似,我仍然对这个特殊排列的功能有些模糊,而其他的(包括我的)却没有。 –

1

URLURLResourceValues头文档,您可能需要编写是这样的:(此代码假设chosenURLURL?型)

do { 
    if 
     let resValues = try chosenURL?.resourceValues(forKeys: [.creationDateKey]), 
     let createDate = resValues.creationDate 
    { 
     //Use createDate here... 
    } 
} catch { 
    //... 
} 

(如果您的chosenURL类型为NSURL?,请尝试此代码。)

do { 
    if 
     let resValues = try (chosenURL as URL?)?.resourceValues(forKeys: [.creationDateKey]), 
     let createDate = resValues.creationDate 
    { 
     //Use createDate here... 
     print(createDate) 
    } 
} catch { 
    //... 
} 

我建议您尽可能使用URL而不是NSURL

+1

谢谢你,但编译器抱怨说,'类型的值[URLResourceKey:任何]没有成员“creationDate''这对我来说似乎很疯狂。 –

+0

@CraigSmith,对不起,我错过了你在标题和评论中指定了'NSURL',并且我的代码假设'chosenURL'的类型是'URL?'。当我将'chosenURL'声明为'URL?'时,它在我的Xcode 8(8A218a)中实际编译时没有错误。请尝试。 – OOPer

+0

这个URL v NSURL的东西很疯狂。你是正确的,你的代码的确可以使用单个URL或NSURL,但是,当我尝试在NSFileManager派生的Enumerator(我相信是NSURL)中使用它时,编译器会抱怨'条件绑定的Initializer必须具有Optional类型,没有URLResourceValues.'与两个排列相同的错误,实际上,Xcode(8)提示在两种情况下对相同错误进行代码更正。这让我很生气。 –