title: Move/copy PHAsset from one album to another
body: <p>I want to move an asset from one album to another. But I could only find information on creating and deleting assets. The reason I want to move instead of creating a new one and deleting the old copy is, I want to preserve the bits of data like the <code>localIdentifier</code> of the asset. If I recreate an asset in another album, it will be assigned a new <code>localIdentifier</code>, am I right?</p>
  
  <p>But it seems it's not possible. So I resorted to copying the asset at least. But it's giving me trouble as well.</p>
  
  <p>Here's my code.</p>
  
  <pre><code>func copyAsset() {
      if let assets = getAssetsFromCollection(collectionTitle: "Old") {
          if getAssetColection("New") == nil {
              createCollection("New") { collection in
                  if let collection = collection {
                      print("Collection created")
                      self.copyAssetsToCollection(assets, toCollection: collection)
                  }
              }
          }
      }
  }
  
  /**
   Copy assets to album.
  
   - parameter assets:     Array of assets to copy.
   - parameter collection: The collection where the assets need to be copied.
   */
  func copyAssetsToCollection(assets: [PHAsset], toCollection collection: PHAssetCollection) {
      PHPhotoLibrary.sharedPhotoLibrary().performChanges({
          let asset = assets.first!
          print(asset.localIdentifier)
          let assetChangeRequest = PHAssetChangeRequest(forAsset: asset)
          let assetPlaceholder = assetChangeRequest.placeholderForCreatedAsset!
  
          let collectionChangeRequest = PHAssetCollectionChangeRequest(forAssetCollection: collection)!
          collectionChangeRequest.addAssets([assetPlaceholder])
      }, completionHandler: { success, error in
          if success {
              print("Photo copied to collection")
          } else {
              if let error = error {
                  print("Error adding photos to collection: \(error.code) - \(error.localizedDescription)")
              }
          }
      })
  }
  
  /**
   Retrieve the album for the given title.
  
   - parameter title: Album title.
  
   - returns: Album if it exists. nil if it doesn't.
   */
  func getAssetColection(title: String) -&gt; PHAssetCollection? {
      let fetchOptions = PHFetchOptions()
      fetchOptions.predicate = NSPredicate(format: "title ==[cd] %@", title)
      if let collection = PHAssetCollection.fetchAssetCollectionsWithType(.Album, subtype: .AlbumRegular, options: fetchOptions).firstObject {
          return collection as? PHAssetCollection
      }
      return nil
  }
  
  /**
   Get assets from a given album.
  
   - parameter title: Album title.
  
   - returns: An array of assets if they exist. nil if they don't.
   */
  func getAssetsFromCollection(collectionTitle title: String) -&gt; [PHAsset]? {
      var assets = [PHAsset]()
      if let collection = getAssetColection(title) {
          let fetchOptions = PHFetchOptions()
          fetchOptions.predicate = NSPredicate(format: "mediaType == %d", PHAssetMediaType.Image.rawValue)
          let fetchResult = PHAsset.fetchAssetsInAssetCollection(collection, options: fetchOptions)
          fetchResult.enumerateObjectsUsingBlock { object, index, stop in
              if let asset = object as? PHAsset {
                  assets.append(asset)
              }
          }
          return assets
      }
      return nil
  }
  
  /**
   Create an album in Photos app.
  
   - parameter title:      Album title.
   - parameter completion: Album if successfully created. nil if it fails.
   */
  func createCollection(title: String, completion: (collection: PHAssetCollection?) -&gt; ()) {
      var albumPlaceholder: PHObjectPlaceholder!
      PHPhotoLibrary.sharedPhotoLibrary().performChanges({
          let request = PHAssetCollectionChangeRequest.creationRequestForAssetCollectionWithTitle(title)
          albumPlaceholder = request.placeholderForCreatedAssetCollection
      }, completionHandler: { success, error in
          if success {
              let fetchResult = PHAssetCollection.fetchAssetCollectionsWithLocalIdentifiers([albumPlaceholder.localIdentifier], options: nil)
              completion(collection: fetchResult.firstObject as? PHAssetCollection)
          } else {
              if let error = error {
                  print("Failed to create album: \(title) in Photos app: \(error.code) - \(error.localizedDescription)")
                  completion(collection: nil)
              }
          }
      })
  }
  </code></pre>
  
  <p>The app crashes at the line <code>let assetPlaceholder = assetChangeRequest.placeholderForCreatedAsset!</code> for finding <code>nil</code> value for the <code>placeholderForCreatedAsset</code>. Which means <code>PHAssetChangeRequest(forAsset: asset)</code> can only be used to changing an asset's metadata and not duplicating it.</p>
  
  <p>Is there any other way to do this? Any workaround or hack? I'll really appreciate any help. </p>