2016-07-18 7 views
2
holen

Ich werde damit beginnen zu sagen, ich bin neu zu schnell, sowie Stack-Überlauf, so entschuldige ich mich, wenn ich etwas durcheinander bringen.Das letzte Foto mit Swift

Ich versuche, das letzte Foto mit Swift zu holen. Ich habe Code gefunden, der so aussieht, als müsste es funktionieren. 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) 
    } 
    } 
} 

Ich erhalte eine Fehlermeldung auf der Linie, die "if let fetchResult = PHAsset.fet...."

Der Fehler sagt beginnt, "

Initializer für bedingte Bindung muss Optional Typ haben, nicht ‚PHFetchResult '

Wenn ich Option, klicken Sie auf "fetchResult ", es sagt mir nicht, welche Art von Wert es ist und gibt und Fehler, so dass ich weiß, dass es nicht richtig eingestellt ist.

Ich fühle mich wie die Lösung ist wahrscheinlich etwas wirklich einfaches, das ich noch nicht ausprobiert habe.

Hat jemand eine Idee, was diesen Fehler verursacht?

Antwort

2

Überprüfen Sie die Erklärung der PHAsset.fetchAssetsWithMediaType(_:options:) Methode. (Quick Help würde genug arbeiten.)

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

Der Rückgabetyp der Methode ist PHFetchResult, die nicht eine Hinter ? hat, dh es ist nicht optional.

Sie können den nicht optionalen Typ nicht als rechte Seite der optionalen Bindung verwenden, und das ist es, was die Fehlermeldung sagt. Und es bedeutet auch Sie müssen die NULL-Fähigkeit nicht überprüfen mit if-let.

Entfernen Sie einfach die if-let verursacht den Fehler und ersetzen Sie es durch eine einfache let Deklaration.

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) 
    } 
} 
Verwandte Themen