74854

[code]

    https://developer.apple.com/documentation/networkextension/neapppushdelegate?language=objc
    @protocol NEAppPushDelegate
    - appPushManager:didReceiveIncomingCallWithUserInfo:
    
[/code]

上記をObjective-Cのクラスに実装して使用したいと考えています。そこで、

Otameshi.h

[code]

    #import <Foundation/Foundation.h>
    #import <NetworkExtension/NetworkExtension.h>
    @interface Otameshi : NSObject <NEAppPushDelegate>
    - (void)appPushManager:(NEAppPushManager *)manager didReceiveIncomingCallWithUserInfo:(NSDictionary *)userInfo API_AVAILABLE(ios(14.0)) API_UNAVAILABLE(macos, tvos) __WATCHOS_PROHIBITED;
    @end
    
[/code]

Otameshi.m

[code]

    #import "Otameshi.h"
    @implementation Otameshi {（１）
        - (void)appPushManager:(NEAppPushManager *)manager didReceiveIncomingCallWithUserInfo:(NSDictionary *)userInfo {（２）
        }
    }
    @end
    
[/code]

のように実装したのですが、（１）で以下のようなワーニングが出ており、

[code]

    Class 'Otameshi' does not conform to protocol 'NEAppPushDelegate'
    Method definition for
    'appPushManager:didReceiveIncomingCallWithUserInfo:' not found
    
[/code]

（２）の「-」箇所で以下のエラーが出てしまいます。

[code]

    Expected ';' at end of declaration list Expected member name or ';'
    after declaration specifiers Type name requires a specifier or
    qualifier
    
[/code]

[Objective-C プロトコルを理解する -
Qiita](https://qiita.com/daisuke0131/items/9fd0c5392db07d441788)

を参考にプロトコルを拡張しようとしているのですが、足りていない箇所はありますでしょうか？

(Xcode12.4を使用しています）


CC BY-SA 4.0
2021-03-24T01:00:42.567
74849
2021-03-25T00:34:01.610
2021-03-25T00:34:01.610
44177
44177
question
xcode objective-c
Objective-Cでデリゲート用のプロトコルを実装する


最初に用語のことを言うと、(私がご質問内容を勘違いしているのでなければ)あなたが質問されているような事柄を「(プロトコルを)拡張する」と言う言い方はしません。「(プロトコルを)実装する」または「(プロトコルに)準拠させる」、「(プロトコルに)適合させる」と言うのが普通でしょう。

(Objective-
Cでは、カテゴリーを使った「拡張」の形でプロトコルの実装を記述することがよくあるので、その辺の記事にある記述を混同されたのでしょうか？とりあえずご質問内のリンク中の記事には一切「拡張」と言う言葉は出てきませんが。)

### 1点目 `@interface`に実装するプロトコロルのメソッド宣言は(普通は)書きません

完全に正確に書くのなら、書いても実害はありませんが、一文字でも間違えると意図せぬ結果となる可能性もありますので、普通は書きません。リンク先の記事でなぜわざわざ書いているのかは不明ですが、「普通は書かない」と思った方が良いでしょう。

[code]

    #import <Foundation/Foundation.h>
    #import <NetworkExtension/NetworkExtension.h>
    
    @interface Otameshi : NSObject <NEAppPushDelegate>
    @end
    
[/code]

### 2点目 `@implementation`に開始括弧(`{`)は不要

[code]

    #import "Otameshi.h"
    
    @implementation Otameshi // { <- ここには括弧は不要
    
    - (void)appPushManager:(NEAppPushManager *)manager didReceiveIncomingCallWithUserInfo:(NSDictionary *)userInfo {
        //...
    }
    
    @end
    
[/code]


CC BY-SA 4.0
2021-03-24T04:56:18.243
74854
2021-03-24T04:56:18.243
13972
74849
answer