1. 程式人生 > >在swift中儲存圖片到相簿

在swift中儲存圖片到相簿

本來是沒有必要把這麼小的一個知識點寫到部落格中的,但是,由於OC中的一些語法在swift中實現的時候有些特別,所以單獨寫下來到部落格中,希望能夠幫助到有需要的同學。

1.OC中的寫法

在OC中,我們需要儲存圖片到相簿需要呼叫這個方法:

void UIImageWriteToSavedPhotosAlbum(UIImage *image, id completionTarget, SEL completionSelector, void *contextInfo);

想來大家也都看過這個方法的標頭檔案,在標頭檔案中有這樣一段話

// Adds a photo to the saved photos album.  The optional completionSelector should have the form:
//  - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;

意思是:想要將一張照片儲存到相簿中,這個可選的完成方法需要按照下面那個方法的格式來定義。
所以,我們在OC中通常都是直接將這個方法拷貝出來,直接實現這個方法,舉個栗子:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    UIImageWriteToSavedPhotosAlbum(self.iconView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);

}
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {

    if (error) {
        NSLog(@"儲存出錯");
        return;
    }

    NSLog(@"儲存成功");
}

在上面這個栗子中,我通過手指觸控事件,將事先定義好的iconView中的影象儲存到相簿中。

而同樣一個栗子,在Swift中應該怎麼樣實現呢?

2.swift中的寫法

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

    UIImageWriteToSavedPhotosAlbum(iconView.image, self, "image:didFinishSavingWithError:contextInfo:", nil)

}

    func image(image: UIImage, didFinishSavingWithError: NSError?, contextInfo: AnyObject) {
    println("---")

    if didFinishSavingWithError != nil {
        println("錯誤")
        return
    }
    println("OK")
}

同樣的栗子,swift中的實現如上,在swift中,我們跳到標頭檔案會發現是這樣的,

// Adds a photo to the saved photos album.  The optional completionSelector should have the form:
//  - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;

還是OC中那一套,蘋果並沒有幫我們寫好swift下的程式碼格式應該怎麼寫,所以很多人對此應該怎麼使用會產生許多的疑惑,其實,就是像上面那樣,將引數一一對應,以swift中函式的寫法寫出來就可以了。
另外補充一點小知識點:
上面的那個方法我們還可以這麼寫,

    // 提示:引數 空格 引數別名: 型別
func image(image: UIImage, didFinishSavingWithError error: NSError?, contextInfo: AnyObject) {
    println("---")

//        if didFinishSavingWithError != nil {
    if error != nil {
        println("錯誤")
        return
    }
    println("OK")
}

類似這樣的格式:(引數 引數別名: 型別)didFinishSavingWithError error: NSError?
在外部呼叫時,顯示的是didFinishSavingWithError這個引數名
而在內部使用時,顯示的是error這個引數別名,方便我們的使用,也更加類似OC中的寫法。