- 締切済み
Swiftについて教えてください
前回PHAssetからNSDataへの変換のしかたを質問させていただき、回答をいただきました。それを参考にいろいろ調べてみたのですが、勉強不足で解決できませんでした。 requestImageDataForAssetを使いPHAssetから直接NSDataを作れることは分かったのですが、具体的な使い方が分からず、投稿させていただきました。 前回の質問で回答をいただいた func requestImageDataForAsset(_ asset: PHAsset, options options: PHImageRequestOptions?, resultHandler resultHandler: (NSData?, String?, UIImageOrientation, [NSObject : AnyObject]?) -> Void) -> PHImageRequestID これが理解できずにいます。 aseetという配列の中にPHAssetが入っており、1つずつPHAssetを取り出し、NSDataに変換し、nsdataという配列に格納していきたいと考えています。 requestImageDataForAssetを使って上記のようなことをするにはどのようにしたらよいのか教えてください。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Lchan0211b
- ベストアンサー率61% (573/930)
No.2の補足の質問について回答します。 > 後置クロージャを普通にしたら > { > image, info in > //ここでUIImageを取得します。 > self.photoImageView.image = image > print("UIImage get!"); > } > は、下記と同じということでいいのでしょうか? > resultHandler:{(image,info)->Void in > //ここでUIImageを取得します。 > self.photoImageView.image = image > print("UIImage get!"); > }) > resultHandlerは書く必要はないのでしょうか? 同じです。 resultHandlerは書く必要ありません。 安易に質問しないで、疑問に思うなら実際に両方のコーディングを 自分で動かして試してみてください。それでもし同じでないと思う状況を見つけたのなら その具体例を説明して質問してください。 > image, infoがどこと関係してるのかがよく分かりません。 > imageはUIImageを定義しておくのでしょうか? > infoは何を意味していますか? クロージャの引数は、AppleのリファレンスのrequestImageForAssetの説明にある通り resultHandler: (UIImage?, [NSObject : AnyObject]?) -> Void) と定義されていて、 第1パラメータはUIImage(のオプショナル型)で、 第2パラメータは[NSObject : AnyObject]というDictionary(のオプショナル型)です。 参考サイトのサンプルでは、それにそれぞれimage、infoという名前をつけて受け取っているだけです。(名前は別にimageやinfoじゃなくてもかまいません。参考サイトのサンプルではわかりやすいからそういう名前にしているだけです。) infoで受け取る内容は、これもAppleのリファレンスにある通り 「A dictionary providing information about the status of the request. See Image Result Info Keys for possible keys and values.」 リクエストの状態についての情報を提供するDictionaryです。 取り得るキーと値については「Image Result Info Keys」を参照してくださいとあるので、 その青いリンクをクリックして https://developer.apple.com/library/ios/documentation/Photos/Reference/PHImageManager_Class/#//apple_ref/doc/constant_group/Image_Result_Info_Keys を参照すれば、そこに詳しく説明されています。 このあたりもピンと来なければ、安易に質問する前に サンプルで示されたものを動かして、実際に受け取ったinfoの値を printで出力して確認する等、自分で調べる癖をつければ、 実際のイメージがわき、自分で理解できるようになってくるはずです。
- Lchan0211b
- ベストアンサー率61% (573/930)
No.1です。 > この部分はどういう意味ですか? これはimageを取得した時に呼び出されるクロージャの呼び出しパラメータ形式を表しています。 > 戻り値のPHImageRequestIDはどんな値なのでしょうか? 参考にしているAppleのリファレンスサイトで、その「->PHImageRequestID」 と描かれている青い文字をクリックしたら、 https://developer.apple.com/library/ios/documentation/Photos/Reference/PHImageManager_Class/#//apple_ref/swift/tdef/c:@T@PHImageRequestID に移動すると思います。 そこに書かれている通り、イメージ取得要求に対応するIDで、 もし途中でイメージ取得をキャンセルしたくなった時に、 そのIDを使って、どの取得要求をキャンセルするのか指定するのに使います。 > 教えていただいたサイトの以下の部分にないのですが必要ではないのでしょうか? これは、Trailing Closure(後置クロージャ)と呼ばれるswift独特の書き方で、 最終パラメータにクロージャを記述する場合、通常は、最終パラメータ記述位置に{~}でクロージャを書いて、 最後にメソッドパラメータの終了を意味する閉じかっこ「)」を入れますが、これだと、最後の閉じかっこが「})」の ようになってややこしくなるので、最終パラメータでクロージャを記述する場合に限って、 先に閉じかっこ「)」を入れて関数パラメータの定義を終了させ、その直後に「{~}」を書くことで、 最終パラメータのクロージャを記述することができるようになっています。 一方、入力パラメータ形式通りにパラメータ内に記述するクロージャは、インラインクロージャと呼ばれます。 後置クロージャもインラインクロージャも書き方が違うだけで意味は同じです。 以下のサイトが参考になると思います。 http://swiftrithm.com/closures-trailing-closures/
- Lchan0211b
- ベストアンサー率61% (573/930)
前回の回答は、「requestImageForAssetでPHAssetからUIImageを作る方法を理解しているのであれば」という前提で回答しましたが、それを理解していないなら、 http://swift-salaryman.com/phasset.php とかを参考にして、まずはPHAssetからUIImageを取得する方法をマスターしてください。 それがマスターできれば、使い方は似たようなものです。
お礼
回答ありがとうございます requestImageForAssetでPHAssetからUIImageを取得する方法を十分理解できていませんでした。 今回教えていただいたサイトを参考にUIImageを取得することはできたのですが、appleのリファレンスとの違いを教えていただきたく補足コメントに質問させてください。
補足
リファレンスには requestImageForAsset(_ asset: PHAsset, targetSize targetSize: CGSize, contentMode contentMode: PHImageContentMode, options options: PHImageRequestOptions?, resultHandler resultHandler: (UIImage?, [NSObject : AnyObject]?) -> Void) -> PHImageRequestID とあります。引数にある resultHandler resultHandler: (UIImage?, [NSObject : AnyObject]?) -> Void) この部分はどういう意味ですか? 戻り値のPHImageRequestIDはどんな値なのでしょうか? 教えていただいたサイトの以下の部分にないのですが必要ではないのでしょうか? phimgr.requestImageForAsset(asset as! PHAsset, targetSize: CGSize(width: 320, height: 320), contentMode: .AspectFill, options: nil) { image, info in //ここでUIImageを取得します。 self.photoImageView.image = image print("UIImage get!"); } image, info inの部分の意味はどういう意味でしょうか?(クロージャー?) 教えてください。よろしくお願いします。分からないことが多くてすみません。
お礼
丁寧な回答ありがとうございます。 クロージャがについて以前にも調べたことがあったのですが、理解しきれず、引数のなかで処理した値を使うってことかと思ってます。なの後置クロージャなどは全く理解できてませんでした。 追加の質問よろしくお願いします。
補足
後置クロージャを普通にしたら { image, info in //ここでUIImageを取得します。 self.photoImageView.image = image print("UIImage get!"); } は、下記と同じということでいいのでしょうか? resultHandler:{(image,info)->Void in //ここでUIImageを取得します。 self.photoImageView.image = image print("UIImage get!"); }) resultHandlerは書く必要はないのでしょうか? 引数 asset as! PHAsset targetSize: CGSize(width: 320, height: 320) contentMode: .AspectFill options: nil は理解できるのですが、 クロージャの引数のimage, infoがどこと関係してるのかがよく分かりません。 imageはUIImageを定義しておくのでしょうか? infoは何を意味していますか? 教えてください。よろしくお願いします。