2016-09-14 10 views
1

このフォーラムのさまざまな有益な投稿のおかげで、ユーザーが選択した単一のNSURLの作成日を取得するためのコードがいくつかあります。しかし、コードをハードコードされたNSURLでもNSFileManagerの列挙子を通してループ内でも動作させることはできません。NSURL getResourceValue Swift 3

私はプロのプログラマーではありません。私はオフィスのためのツールであるアプリを作る。私の最終的な目標は、Creation Dateに基づいて単純に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

あなたは次のようにURLを拡張することができます。

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

用法:

print(yourURL.creationDate) 
+1

それは美しく動作しますが、コードは@OOPerが投稿したものと非常によく似ているように見えますが、この特定の順列がなぜ機能するのか、そして他のもの(私を含む)はまだ霧があるのです。 –

1

URLURLResourceValuesのヘッダドキュメントによると、あなたはこのような何か書く必要がある場合があります(このコードはchosenURLがタイプURL?であると仮定している)

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 { 
    //... 
} 

できるだけNSURLではなくURLを使用することをお勧めします。

+1

はありがとうございますが、コンパイラは型の値[URLResourceKey:任意] 'と文句を言い何のメンバー「を持っていないcreationDate''それは私に狂っているようです。 –

+0

@CraigSmith、申し訳ありませんが、タイトルとコメントにNSURLを指定していませんでした。私のコードでは、 'selectedURL'は' URL? '型であると想定しています。 'selectedURL'を' URL? 'と宣言すると、実際に私のXcode 8(8A218a)でエラーなくコンパイルされます。してみてください。 – OOPer

+0

このURL v NSURLのものは狂っています。あなたのコードが実際には単一のURLまたはNSURLで機能するのは間違いありませんが、NSFileManager派生列挙子(NSURLと思われます)の中で使用しようとすると、コンパイラは '条件付きバインディングの初期化子はオプション型、URLResourceValuesはありません。どちらの置換でも同じエラーが発生します。実際、Xcode(8)は両方のシナリオで同じエラーが発生した場合のコード修正を促します。それは私に怒っている。 –