2016-09-14 6 views
1

Благодаря множеству полезных сообщений в этом форуме у меня есть код, который работает для получения Даты создания одного выбранного пользователем NSURL. Тем не менее, я не могу заставить код работать как с жестко закодированным NSURL, так и внутри цикла через NSFileManager-перечислитель.NSURL getResourceValue Swift 3

Я не профессиональный программист; Я делаю приложения, которые являются инструментами для офиса. Моя конечная цель - просто отсортировать массив объектов NSURL на основе даты создания.

кода я использую ниже, который функционирует так же хорошо, как есть, но если я пытаюсь использовать комментируемую строку для оценки конкретного файла PDF, я получаю следующее сообщение об ошибке:

enter image description here

Я получаю ту же ошибку, когда пытаюсь добавить этот код в цикл объектов NSURL, приобретенных через NSFileManager Enumerator.

Я не могу понять, как использовать инструкцию по ошибке для решения проблемы. Если кто-то может помочь, это будет потрясающе. Спасибо.

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

Согласно заголовка РОУ URL и URLResourceValues, вам может понадобиться, чтобы написать что-то вроде этого: (. Этот код принимаемой 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 { 
    //... 
} 

Я рекомендую вам использовать URL, а не NSURL, насколько это возможно.

+1

Спасибо, но компилятор жалуется, что 'Значение типа [URLResourceKey: Любой] не имеет ни один из членов«creationDate'' который кажется сумасшедшим для меня. –

+0

@CraigSmith, извините, мне не хватало, вы указываете 'NSURL' в заголовке и комментарии, а мой код предполагает, что' selectedURL' имеет тип 'URL?'. Он фактически компилируется без ошибок в моем Xcode 8 (8A218a), когда я объявляю 'selectedURL' как' URL? '. Пожалуйста попробуйте. – OOPer

+0

этот URL v Материал NSURL сумасшедший. Вы правы, что ваш код действительно работает с одним URL или NSURL, однако, когда я пытаюсь использовать его внутри производного Enumerator NSFileManager (который, я считаю, NSURL), компилятор жалуется: «Инициализатор для условной привязки должен иметь необязательный тип , нет URLResourceValues. 'То же самое с перестановкой, по сути, Xcode (8) вызывает исправления кода в обоих сценариях с той же ошибкой. Это сумасшествие для меня. –