質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

501閲覧

swiftのクロージャの値の受け渡しが理解できない(Firebase使用)

masamasamasa

総合スコア95

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

2グッド

1クリップ

投稿2018/07/13 04:31

編集2018/07/13 09:19

わからないこと

// 関数の定義 class PostApi { var REF_POSTS = FIRDatabase.database().reference().child("posts") func observePosts(completion: @escaping (Post) -> Void) { REF_POSTS.observe(.childAdded) { (snapshot: FIRDataSnapshot) in if let dict = snapshot.value as? [String: Any] { let newPost = Post.transformPostPhoto(dict: dict, key: snapshot.key) completion(newPost)⇦ わからない部分① } } } } // 関数の呼び出し override func viewDidLoad() { super.viewDidLoad() loadPosts() } func loadPosts() { Api.Post.observePosts { (post) in ⇦ わからない部分② self.fetchUser(uid: post.uid!, completed: { self.posts.append(post) }) } }

おそらくなのですが、わからない部分①のnewPostの値がわからない部分②のpostに入っていると思います。

completionで渡して、呼び出し時にトレイリングクロージャで引数を付ければ、値は渡されると考えておけばよいですか?

たくさん調べて、トレイリングクロージャのことはなんとなく理解できたのですが、値が渡される部分がいまいち理解できません。

補足なのですが、.childAddedで取得した値が、snapshotで受け取られていると思うのですが、そこもおんなじ感じでしょうか?

すみませんが、よろしくお願いします。

tanakana, Teratopi👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

単純化して考えましょう

swift

1func hoge(_ i: Int) -> Int { 2 3 return i * 2 4} 5 6let f = hoge 7 8let g = { (i: Int) -> Int in i * 2 } 9 10print(f(2)) // prints 4 11print(g(2)) // prints 4 12

f と g は同じことなんですが、これは分かりますか?


swift

1func closureTest(_ f: (Int) -> Int) { 2 3 // 受け取った関数fに引数2を与えて実行 4 let result = f(2) 5 6 print(result) 7}

closureTest関数は引数として関数を受けっとって受け取った関数に2を与えてその結果をprintします。
これは分かりますか?


swift

1closureTest(hoge) // 関数を与える 2closureTest( { (i: Int) -> Int in i * 2 } ) // クロージャを与える 3closureTest { (i: Int) -> Int in i * 2 } // トレーリングクロージャ

これは全て同じ事です。
そしてclosureTestは与えられた関数に 2 を与えて実行するのですから、
与えた関数、クロージャは 2 を与えられて実行されます。

投稿2018/07/13 09:11

MasakiHori

総合スコア3384

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masamasamasa

2018/07/13 09:21

回答ありがとうございます。 書かれたことは理解できるのですが、質問の値の部分がまだ理解しづらいです。
masamasamasa

2018/07/13 09:32

なるほど。 ずっと眺めていたら理解できるようになりました! ありがとうございます。
guest

0

newPostの値がTrailing Closureのpostの値で渡っているという認識であっています。

同様に

swift

1func observePosts(completion: @escaping (Post, Error?) -> Void) { 2 // 省略 3 completion(newPost, error) 4 // 省略 5} 6 7func loadPosts() { 8 Api.Post.observePosts { (post, error) in 9 // 省略 10 } 11} 12

などとすれば2つ渡すことができます。

投稿2018/07/13 09:38

hiro_n

総合スコア70

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masamasamasa

2018/07/13 09:39

ありがとうございます。 参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問