2016-07-18 2 views
2

Начну с того, что я новичок в быстром, а также переполнении стека, поэтому извиняюсь, если что-то испортил.Извлечение последней фотографии, сделанной с помощью Swift

Я пытаюсь взять последнюю фотографию с Swift. Я нашел код, который кажется, что он должен работать. http://blog.swilliams.me/words/2015/08/09/finding-the-last-photo-taken/

import UIKit 
import Photos 

typealias ImageCallback = (UIImage? -> Void) 

func fetchLastPhoto(resizeTo size: CGSize?, imageCallback: ImageCallback) { 
let fetchOptions = PHFetchOptions() 
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] 
fetchOptions.fetchLimit = 1 

if let fetchResult = PHAsset.fetchAssetsWithMediaType(.Image, options: fetchOptions) { 
    if let asset = fetchResult.firstObject as? PHAsset { 
     let manager = PHImageManager.defaultManager() 
     let targetSize = size == nil ? CGSize(width: asset.pixelWidth, height: asset.pixelHeight) : size! 
     manager.requestImageForAsset(asset, 
      targetSize: targetSize, 
      contentMode: .AspectFit, 
      options: nil, 
      resultHandler: { image, info in 
      imageCallback(image) 
     }) 
    } else { 
     imageCallback(nil) 
    } 
    } 
} 

Я получаю сообщение об ошибке в строке, которая начинается "if let fetchResult = PHAsset.fet...."

Ошибка говорит, "

Initializer для условной привязки должны иметь факультативный тип, не «PHFetchResult '

Если у меня есть опция «012»", он не говорит мне, какой тип значения он имеет и дает, и ошибки, поэтому я знаю, что он не устанавливается правильно.

Я чувствую, что решение, вероятно, что-то действительно простое, что я еще не пробовал.

Кто-нибудь знает, что вызывает эту ошибку?

ответ

2

Проверьте декларацию PHAsset.fetchAssetsWithMediaType(_:options:). (Быстрая помощь будет работать достаточно.)

class func fetchAssetsWithMediaType(mediaType: PHAssetMediaType, options: PHFetchOptions?) -> PHFetchResult 

Возвращаемый тип метода PHFetchResult, который не имеет косую ?, а это означает, что он не Опциональный.

Вы не можете использовать необязательный тип как правую часть необязательной привязки, и это то, что говорит сообщение об ошибке. И это также означает , вам нет необходимости проверять значение nullability, используя if-let.

Просто удалите if-let, вызвав ошибку, и замените ее на простую декларацию let.

func fetchLastPhoto(resizeTo size: CGSize?, imageCallback: ImageCallback) { 
    let fetchOptions = PHFetchOptions() 
    fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] 
    fetchOptions.fetchLimit = 1 

    let fetchResult = PHAsset.fetchAssetsWithMediaType(.Image, options: fetchOptions) 
    //`fetchResult` is not nil here (without using `if-let`) 
    if let asset = fetchResult.firstObject as? PHAsset { 
     let manager = PHImageManager.defaultManager() 
     let targetSize = size == nil ? CGSize(width: asset.pixelWidth, height: asset.pixelHeight) : size! 
     manager.requestImageForAsset(asset, 
            targetSize: targetSize, 
            contentMode: .AspectFit, 
            options: nil, 
            resultHandler: { image, info in 
             imageCallback(image) 
     }) 
    } else { 
     imageCallback(nil) 
    } 
} 
Смежные вопросы