gpt4 book ai didi

ios - 如何符合定义具有相同名称和不同签名的方法的两个协议(protocol)?

转载 作者:可可西里 更新时间:2023-11-01 06:23:18 24 4
gpt4 key购买 nike

我正在使用 iOS7 的新功能,MultipeerConnectivity。它带有一个函数 didChangeState:

在 ViewController.h 中,

#import <GameKit/GameKit.h>
#import <MultipeerConnectivity/MultipeerConnectivity.h>
@interface ViewController : UIViewController <GKPeerPickerControllerDelegate, GKSessionDelegate, MCBrowserViewControllerDelegate, MCSessionDelegate>

在 ViewController.m 中,需要实现以下两个方法:

- (void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state{ ...... }

//与 iOS6 Gamekit 函数重复的名称:

- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state { ...... }

由于iOS不支持函数重载,我该如何在同一个程序中同时包含这两个函数呢?编译失败。错误:方法“session:peer:didChangeState:”的重复声明我正在使用最新的 XCode 5.0.1。

最佳答案

问题不在于导入这两个框架,而在于您的类同时符合 GKSessionDelegateMCSessionDelegate在同一个类中实现这两个方法是您无法做到的,因为它们具有相同的名称。

您将不得不使用两个不同的类,一个符合 GKSessionDelegate,一个符合 MCSessionDelegate


原始答案

只需继续并包含它们即可。

导入两个定义同名方法的类绝不是方法重载。

当在同一个类层次结构中定义多个具有相同名称但不同签名的方法时会发生重载,这里不是这种情况(而且永远不会,因为它在 Objective-C 中是被禁止的)


您可能遇到的唯一问题是,当您没有提供足够的信息时,编译器无法正确地进行类型检查。

例如,如果你这样做

id anObject = //... retrieve the object
[anObject session:aSession peer:anId didChangeState:aState]

编译器会警告您他无法理解您正在调用的两个方法中的哪一个,因为没有关于类型的信息。一个简单的转换将使编译器安静下来。

不过在运行时,您不会有问题,因为类型将被动态解析。

例如,您可以引用最近的这个问题:How to get rid of the "Incompatible pointer types" warning?

关于ios - 如何符合定义具有相同名称和不同签名的方法的两个协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19795603/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com