【问题标题】:What are the angle brackets "<…>" in an Obj-C class interface for?Obj-C 类接口中的尖括号“<…>”有什么用?
【发布时间】:2009-12-16 11:04:33
【问题描述】:

谁能告诉我Objective-C 类接口中的尖括号&lt;...&gt; 有什么作用?喜欢这个(来自http://snipt.net/robhawkes/cocoa-class-interface):

@interface MapMeViewController : UIViewController <CLLocationManagerDelegate, 
            MKReverseGeocoderDelegate, MKMapViewDelegate, UIAlertViewDelegate> { ... }

在我看来,它们看起来像是某种类型声明(考虑到我以前在 PHP 和 JavaScript 方面的经验),就像我们要确保 MapMeViewControllerCLLocationManagerDelegateMKReverseGeocoderDelegateMKMapViewDelegate 或 @ 987654328@

关于@interface 语法的文档似乎没有提到这一点。

【问题讨论】:

    标签: objective-c macos cocoa objc-protocol


    【解决方案1】:

    类接口定义中的尖括号表示您的类所遵循的协议。

    协议几乎类似于 Java 或 C# 中的接口,此外,Objective-C 协议中的方法可以是可选的。

    此外,在 Objective-C 中,您还可以声明一个变量、参数或实例变量以符合多个协议。示例

    NSObject<NSCoding, UITableViewDelegate> *myVariable;
    

    在这种情况下,类必须是NSObject 或子类(只有NSProxy 及其子类会失败),并且它还必须同时符合NSCodingUITableViewDelegate 协议。

    在 Java 或 C# 中,这只能通过实际声明所述类来实现。

    【讨论】:

      【解决方案2】:

      尖括号表示protocol。它们类似于其他语言的接口。

      【讨论】:

        【解决方案3】:

        您还可以在代码中使用它们,例如强制转换,告诉编译器期望一个符合特定协议的对象。

        id <NSFetchedResultsSectionInfo> sectionInfo = [[self.noteFetcher sections] objectAtIndex:section];
        

        【讨论】:

          【解决方案4】:

          Apple 文档报告了括号的使用;请参阅第 4 章“采用协议”的The Objective-C Programming Language

          采用协议在某些方面类似于声明超类。两者都将方法分配给类。超类声明为其分配继承的方法;协议为其分配在协议列表中声明的方法。如果一个类在其声明中在超类名称后的尖括号内列出该协议,则称该类采用了正式协议:

          @interface ClassName : ItsSuperclass < protocol list >
          

          类别采用协议的方式大致相同:

          @interface ClassName ( CategoryName ) < protocol list >
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-05-03
            • 1970-01-01
            • 2022-10-01
            • 1970-01-01
            • 2017-09-01
            • 1970-01-01
            • 2019-09-24
            相关资源
            最近更新 更多