获取最后一张用Swift拍摄的照片

时间:2016-07-18 08:55:11

标签: swift phasset photosframework

我将首先说我是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...."

错误说,"

  

条件绑定的初始化程序必须具有Optional类型,而不是   ' PHFetchResult'

当我选择点击" fetchResult"时,它不会告诉我它是什么类型的值并给出和错误,所以我知道它没有正确设置。

我觉得解决方案可能非常简单,我还没有尝试过。

有人知道导致此错误的原因是什么吗?

1 个答案:

答案 0 :(得分:3)

检查PHAsset.fetchAssetsWithMediaType(_:options:)方法的声明。 (快速帮助就足够了。)

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

方法的返回类型是PHFetchResult,它没有尾随?,这意味着它不是可选的。

您不能将非可选类型用作可选绑定的右侧,这就是错误消息所说的内容。它还意味着您无需使用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)
    }
}