下のコード  
<https://github.com/firebase/quickstart-
ios/blob/d60148bc34847da1f80358052bd5bdb1cb6b2597/authentication/AuthenticationExampleSwift/PasswordlessViewController.swift#L65-L71>  
で設定されている`showSpinner`と`hideSpinner`はどんな形式のものかがわかりません。  
プロパティなのか、メソッドなのか、その他なのか...  
書いた方が設定した識別子だと思うのですが。

```

    if let email = self.emailField.text {
        showSpinner {
            // [START signin_emaillink]
            Auth.auth().signIn(withEmail: email, link: self.link) { (user, error) in
                // [START_EXCLUDE]
                self.hideSpinner {
                    if let error = error {
                        self.showMessagePrompt(error.localizedDescription)
                            return
                    }
                    self.navigationController!.popViewController(animated: true)
                }
                // [END_EXCLUDE]
            }
            // [END signin_emaillink]
        }
    } else {
        self.showMessagePrompt("Email can't be empty")
    }
    
```
CC BY-SA 4.0
2019-07-20T08:55:20.930
56773
2019-07-21T09:59:04.067
2019-07-21T09:46:58.270
12297
12297
question
swift
設定された識別子の形式がわかりません。
「書いた方が設定した識別子」と言うのが何か特別な状況を表したいのかどうかわからないのですが、 **Objective-
Cで書かれた`UIViewController`の拡張メソッドをSwiftから使用している**ものです。

[BridgingHeader.h](https://github.com/firebase/quickstart-
ios/blob/d60148bc34847da1f80358052bd5bdb1cb6b2597/authentication/AuthenticationExampleSwift/BridgingHeader.h)

>
```

>     //(コメント略)
>  
>     #import "UIViewController+Alerts.h"
>  
```

[UIViewController+Alerts.h](https://github.com/firebase/quickstart-
ios/blob/d60148bc34847da1f80358052bd5bdb1cb6b2597/authentication/AuthenticationExample/UIViewController%2BAlerts.h)

>
```

>     //(省略)
>  
>     /*! @fn showSpinner
>      @brief Shows the please wait spinner.
>      @param completion Called after the spinner has been hidden.  */
>     - (void)showSpinner:(nullable void (^)(void))completion;
>  
>     /*! @fn hideSpinner
>      @brief Hides the please wait spinner.
>      @param completion Called after the spinner has been hidden.  */
>     - (void)hideSpinner:(nullable void (^)(void))completion;
>  
>     //(省略)
>  
```

[UIViewController+Alerts.m](https://github.com/firebase/quickstart-
ios/blob/d60148bc34847da1f80358052bd5bdb1cb6b2597/authentication/AuthenticationExample/UIViewController%2BAlerts.m)

>
```

>     //(省略)
>  
>     - (void)showSpinner:(nullable void (^)(void))completion {
>       if ([self supportsAlertController]) {
>         [self showModernSpinner:completion];
>       } else {
>         [self showIOS7Spinner:completion];
>       }
>     }
>  
>     //(省略)
>  
>     - (void)hideSpinner:(nullable void (^)(void))completion {
>       if ([self supportsAlertController]) {
>         [self hideModernSpinner:completion];
>       } else {
>         [self hideIOS7Spinner:completion];
>       }
>     }
>  
>     //(省略)
>  
```

と言うわけで、ヘッダーだけでなく、メソッド定義まで書かれています。「設定された識別子」と言うのは、プログラミングの分野ではあまり聞かない言い方ですが、特に何か特別な設定がされているわけではありません。

Swift流に書き直すと、どこかプロジェクト内の別ファイルに、

```

    extension UIViewController {
        //...
    
        func showSpinner(_ completion: (()->Void)?) {
            //...
        }
    
        //...
    
        func hideSpinner(_ completion: (()->Void)?) {
            //...
        }
    
        //...
    }
    
```

こんなextensionが定義されているので、その中のメソッドを使っていると言う感じです。

それぞれのメソッドがどのように動くか(例えば`completion`は常に呼ばれるのかどうか)はObjective-
Cのコードを追っていかないとわかりません。
CC BY-SA 4.0
2019-07-21T08:50:05.703
56785
2019-07-21T09:59:04.067
2019-07-21T09:59:04.067
13972
13972
56773
answer