2016-07-18 9 views
2

나는 새로운 것을 신속하게 말하고 스택 오버플로라고 말함으로써 시작할 것입니다. 그래서 나는 어떤 것을 엉망으로 만들면 사과드립니다.스위프트로 찍은 마지막 사진 가져 오기

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...."

오류는 말한다 시작하는 줄에 오류, "결합 조건에 대한

이니셜 라이저가 계속 PHFetchResult '

"012"를 클릭하면"이라면 어떤 유형의 값인지 알려주지 않으므로 올바르게 설정되지 않은 것입니다.

나는 솔루션이 아마도 아직 시도하지 않은 정말 간단하다고 생각합니다.

누구든지이 오류의 원인을 파악할 수 있습니까?

답변

2

PHAsset.fetchAssetsWithMediaType(_:options:) 메서드의 선언을 확인하십시오. (빠른 도움말이 충분히 작동합니다.)

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

를 메서드의 반환 형식이 PHFetchResult이며, 후행 ?을 가지고 있지 않는, 그것은 그렇지 옵션 의미한다.

선택적 바인딩의 오른쪽에 non-Optional 형식을 사용할 수 없습니다. 이것은 오류 메시지의 의미입니다. 또한 을 의미하므로 if-let을 사용하여 Null 허용 여부를 확인할 필요가 없습니다.

오류를 일으키는 if-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) 
    } 
}