Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标C协议的使用_Objective C_Ios_Protocols_Typechecking - Fatal编程技术网

Objective c 目标C协议的使用

Objective c 目标C协议的使用,objective-c,ios,protocols,typechecking,Objective C,Ios,Protocols,Typechecking,我有一个作业问题,把我弄糊涂了,真的很糟糕。下面是一个问题的简要说明 假设您正在开发一个存储联系人的应用程序 信息。通讯簿可能包含许多实体类型,例如人 作为一家公司或任何其他拥有联系信息的公司 现在,不再显式地检查每个对象类型,而是编写一个 声明对象必须如何行为和成功的协议 出现在您的通讯簿中 我的理解和回答这个问题的努力是, 构建一个协议,该协议在@required标签下包含每种类型联系信息的通用方法。以及@optional下在不同联系人中不相似的所有其他方法(如传真号码与公司关联,但与

我有一个作业问题,把我弄糊涂了,真的很糟糕。下面是一个问题的简要说明

假设您正在开发一个存储联系人的应用程序 信息。通讯簿可能包含许多实体类型,例如人 作为一家公司或任何其他拥有联系信息的公司

  • 现在,不再显式地检查每个对象类型,而是编写一个 声明对象必须如何行为和成功的协议 出现在您的通讯簿中

我的理解和回答这个问题的努力是,

  • 构建一个协议,该协议在
    @required
    标签下包含每种类型联系信息的通用方法。以及@optional下在不同联系人中不相似的所有其他方法(如传真号码与公司关联,但与个人无关…)。在运行时,您可以使用
    选择器
    检查对象是否响应任何给定的方法。 怀疑:不过这又是显式间接检查对象类型,对吗

  • 我的第二个想法是在java中使用类似于
    抽象类的东西。这意味着从抽象类继承的类实现了它们自己的抽象方法。作为一个天真的iOS开发人员,我不知道如何实现这一点?我不确定这是否能解决我的问题。如果有人知道这一点,我想得到启发


  • 外部阅读完成到目前为止,请让我知道,如果我正在寻找的答案是在这些链接之一。我会再读一遍以理解并解决这个问题:)。谢谢


  • 协议与Java接口是一样的。它只是定义类应该支持哪些方法。这里有一页解释得很清楚:

    基本上,如果要确保类将具有
    phoneNumber
    方法(访问
    phoneNumber
    属性),您可以执行以下操作:

    @protocol ContactProtocol
    -(void) phoneNumber;
    @end
    
    @interface Person: NSObject <ContactProtocol> {
        ...
    }
    
    @interface Company: NSObject <ContactProtocol> {
        ...
    }
    
    @协议联系人协议
    -(空)电话号码;
    @结束
    @接口人:NSObject{
    ...
    }
    @接口公司:NSObject{
    ...
    }
    
    然后在编译时(或live for xcode 4),它会告诉您是否忘记将
    phoneNumber
    方法添加到
    Person
    Company
    类中

    然而,这又是显式地间接检查对象类型,对吗

    否,检查行为与检查类型不同。您可以将
    -respondsToSelector:
    发送到任何对象,如果结果为“是”,则无论对象的类型如何,都可以发送消息。您也可以要求对象实现给定的协议,而不考虑其实际类型:

    id<SomeProtocol> foo;  // foo points to any type that implements SomeProtocol
    
    id foo;//foo指向实现SomeProtocol的任何类型
    
    我的第二个想法是在java中使用类似抽象类的东西

    这可能行得通,但这显然不是你的任务要求的,对吧?上面写着“…写一个协议…”

    Objective-C没有像Java那样提供一种显式抽象类的方法。您只需创建类,如果不想直接实例化它,您可以将其记录在某个地方。

    您有。。。选项

    可选方法对于编写类以符合协议的人来说很方便,而对于使用协议的人来说则很烦人。所以这取决于你想取悦谁

    可选方法没有检查类型那么糟糕。想象一下,当访问一个可接触的实体对象时,代码会是什么样子。当您使用可选方法时,必须有if case和else case。这并不像继续并假设您可以调用该方法那样方便。但它比检查类型更方便。对于每种不同类型的实体,这将是一个if情况(以及一个else情况,可能是一个断言)。此外,如果使用可选方法,则有关实体的信息将封装在其类中。如果在调用方法之前检查类型,则有关实体提供的联系人信息类型的信息在调用代码中的类之外。如果您升级实体以提供其他类型的联系人,则在更新呼叫代码之前,该改进不可用

    选项B是使所有方法都成为必需的,但给它们返回一个值的选项,该值指示没有可用的信息,例如nil。当然,这仍然意味着一个if案例要检查一个nil结果,只是没有那么冗长。对于这个问题,更好的解决方案是让这些方法返回多个联系人的集合。毕竟,人们可以有不止一个电话号码。然后,为了指示联系人类型不适用,只需返回一个空集合


    缺点是,无论谁编写符合协议的类,都必须添加一个简单的存根方法,上面写着
    return nil
    或其他什么。

    问家庭作业问题的好方法+1因为下面的链接清楚地解释了协议概念,协议与抽象类不同;相反,它们类似于Java中的接口。从抽象类派生类时,继承方法及其实现。对于接口,您只能得到声明。Obj-c协议也是如此——当您声明一个类实现一个协议时,您必须提供方法实现。您完全正确。我在想接口!我正在更新我的答案。到Otierney.net的链接当前已关闭。这里有一个指向谷歌缓存的链接,不知道它能工作多久。这个问题不是关于Swift的,但是如果是的话,如果我错了,请纠正我:您的第一个答案是:是的,现在在Swift中,协议是一种类型,您只需执行
    delegate?。someMethod
    虽然与
    respondsToSelector
    不同,但如果设置了委托,它将运行函数。。。第二