菜鸟教程小白 发表于 2022-12-12 14:58:39

ios - Obj-c,我可以使用协议(protocol)作为函数参数的一种参数吗?


                                            <p><p>我正在创建一个 cocoa touch 框架来在我的应用程序之间共享一些通用代码。</p>

<p>我需要将一个类的实例传递给一个方法,该方法具有一些特定的属性。</p>

<p>该方法将从应用程序中调用。</p>

<p>我对使用协议(protocol)很陌生。</p>

<p>我是否应该在我的框架中创建一个包含函数所需的所有属性的协议(protocol) h 文件。 </p>

<p>如果可以,我可以将协议(protocol)作为实例变量的类型传递给函数吗?</p>

<p>如果没有怎么能做到这一点?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>是的,你可以。这是一个例子。</p>

<p>首先,在 <code>.h</code> 文件中声明您的协议(protocol):</p>

<pre><code>@protocol Vehicle &lt;NSObject&gt;

@property NSNumber * numberOfWheels;

@required
-(void)engineOn;

@end
</code></pre>

<p>声明符合你的协议(protocol)的类:</p>

<pre><code>#import &#34;Vehicle.h&#34;

@interface Car : NSObject &lt;Vehicle&gt;

@end
</code></pre>

<p>实现所需的方法并综合属性:</p>

<pre><code>@implementation Car
@synthesize numberOfWheels;

-(void)engineOn {
    NSLog(@&#34;Car engine on&#34;);
}

@end
</code></pre>

<p>还有一个,举个例子:</p>

<pre><code>#import &#34;Vehicle.h&#34;

@interface Motorcycle : NSObject &lt;Vehicle&gt;

@end

@implementation Motorcycle
@synthesize numberOfWheels;

-(void)engineOn {
    NSLog(@&#34;Motorcycle engine on&#34;);
}

@end
</code></pre>

<p>当您声明要接受 <code>Vehicle</code> 参数的方法时,您使用通用 <code>id</code> 类型并指定传入的任何对象都应符合 <code>车辆</code>:</p>

<pre><code>#import &#34;Vehicle.h&#34;

@interface Race : NSObject

-(void)addVehicleToRace:(id&lt;Vehicle&gt;)vehicle;

@end
</code></pre>

<p>然后,在该方法的实现中,您可以使用协议(protocol)中声明的属性和方法,而不管传入的具体类型如何:</p>

<pre><code>@implementation Race

-(void)addVehicleToRace:(id&lt;Vehicle&gt;)vehicle {
    ;
}

@end
</code></pre>

<p>然后,如您所料,您可以传入符合您的协议(protocol)的具体类的实例:</p>

<pre><code>Motorcycle *cycle = [ init];
cycle.numberOfWheels = 2;
Car *car = [ init];
car.numberOfWheels = 4;
Race *race = [ init];
;
;
</code></pre>

<p>并且将执行协议(protocol)方法的适当具体实现,具体取决于您作为参数传递的实际具体类型:</p>

<pre><code>2018-10-15 13:53:45.039596+0800 ProtocolExample Car engine on
2018-10-15 13:53:45.039783+0800 ProtocolExample Motorcycle engine on
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - Obj-c,我可以使用协议(protocol)作为函数参数的一种参数吗?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/52807377/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/52807377/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - Obj-c,我可以使用协议(protocol)作为函数参数的一种参数吗?