<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Hi everyone,<div><br></div><div>I'm wondering if someone can suggest a solution to the&nbsp;following&nbsp;problem, it's a bit involved, so apologies&nbsp;in advance :)</div><div><br></div><div>I'm writing an Objective-C protocol as part of a framework, lets call it&nbsp;MyObjectProtocol. Objects that conform to the protocol must also define a collection of other objects, called MyObjectProperty. So we basically have something like this...</div><div><br></div><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span style="color: #aa0d91">@protocol</span> MyObjectProtocol</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; ">+ (<span style="color: #5c2699">NSDictionary</span> *)availableProperties;</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(92, 38, 153); "><span style="color: #000000">+ (</span>MyObjectProperty<span style="color: #000000"> *)propertyForKey:(</span><span style="color: #000000"><span class="Apple-style-span" style="color: rgb(63, 110, 116); ">MyObjectPropertyKey</span>)k;</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; ">- (<span style="color: #5c2699">CGFloat</span>)valueForPropertyKey:(<span style="color: #3f6e74">MyObjectPropertyKey</span>)propKey;</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-style-span" style="color: rgb(170, 13, 145); ">@end</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" color="#AA0D91"><br></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" color="#AA0D91"><span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; ">And an example of a class conforming to the protocol might look like this (only included the important bits):</span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" face="Helvetica" size="3"><span class="Apple-style-span" style="font-size: 12px;"><br></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" face="Helvetica" size="3"><span class="Apple-style-span" style="font-size: 12px;"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span style="color: #aa0d91">typedef</span> <span style="color: #aa0d91">enum&nbsp;<span class="Apple-style-span" style="color: rgb(63, 110, 116); ">MyObjectPropertyKey<span class="Apple-style-span" style="color: rgb(0, 0, 0); ">&nbsp;{</span></span></span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(103, 91, 66); "><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">        </span></span>kTrignometricModelSineProperty<span style="color: #000000"> = </span><span style="color: #1c00cf">1</span><span style="color: #000000">,</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(103, 91, 66); "><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">        </span></span>kTrignometricModelCosineProperty<span style="color: #000000"> = </span><span style="color: #1c00cf">2</span><span style="color: #000000">,</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(103, 91, 66); "><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">        </span></span>kTrignometricModelTangentProperty<span style="color: #000000"> = </span><span style="color: #1c00cf">3</span><span style="color: #000000">,</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; ">} TrignometricModelPropertyKeys;</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span style="color: #aa0d91">@interface</span> TrignometricModel : NSObject &lt;MyObjectModel&gt; {</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(92, 38, 153); "><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">        </span></span>NSInteger<font class="Apple-style-span" color="#000000">&nbsp;</font><span style="color: #354d45">len</span><span style="color: #000000">;</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space:pre">        </span><span style="color: #aa0d91">float&nbsp;</span>*<span style="color: #354d45">buffer</span>;<span class="Apple-tab-span" style="white-space:pre">        </span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space:pre">        </span><span style="color: #aa0d91">float&nbsp;</span>*<span style="color: #354d45">sine</span>;</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space:pre">        </span><span style="color: #aa0d91">float&nbsp;</span>*<span style="color: #354d45">cosine</span>;</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(53, 77, 69); "><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">        </span></span><span style="color: #aa0d91">float&nbsp;</span><span style="color: #000000">*</span>tangent<span style="color: #000000">;</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; ">}</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(170, 13, 145); ">@end</div><div><font class="Apple-style-span" color="#AA0D91" face="Monaco" size="2"><span class="Apple-style-span" style="font-size: 10px;"><br></span></font></div><div><font class="Apple-style-span" color="#AA0D91" face="Monaco" size="2"><span class="Apple-style-span" style="font-size: 10px;"><br></span></font></div><div><font class="Apple-style-span" color="#AA0D91" face="Monaco" size="2"><span class="Apple-style-span" style="font-size: 10px;"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(196, 26, 22); "><span style="color: #643820">#import </span>"TrignometricModel.h"</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span style="color: #aa0d91">@implementation</span> TrignometricModel</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; min-height: 14px; "><font class="Apple-style-span" color="#643820"><font class="Apple-style-span" color="#AA0D91"><br></font></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; ">+ (<span style="color: #5c2699">NSDictionary</span> *)availableProperties {</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space:pre">        </span><span style="color: #aa0d91">static</span> <span style="color: #5c2699">NSDictionary</span> *availableProperties;</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space:pre">        </span><span style="color: #aa0d91">if</span>(!availableProperties) {</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space:pre">                </span>availableProperties = [[<span style="color: #5c2699">NSDictionary</span> <span style="color: #2e0d6e">alloc</span>] <span style="color: #2e0d6e">initWithObjectsAndKeys</span>:</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(113, 109, 110); "><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">                                        </span></span>// Sine property</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(92, 38, 153); "><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">                                        </span>[</span>DTGraphDatasourceProperty<span style="color: #000000"> </span><span style="color: #2e0d6e">defaultPropertyWithName</span><span style="color: #000000">:</span><span style="color: #c41a16">@"Sine"</span><span style="color: #000000">&nbsp;<span class="Apple-style-span" style="color: rgb(170, 13, 145); "><span style="color: #2e0d6e">andKey</span>:<span style="color: #675b42">kTrignometricModelSineProperty</span>],&nbsp;</span></span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(103, 91, 66); "><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">                                        </span>[</span><span style="color: #5c2699">NSNumber</span><span style="color: #000000"> </span><span style="color: #2e0d6e">numberWithInteger</span><span style="color: #000000">:</span>kTrignometricModelSineProperty<span style="color: #000000">],</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(113, 109, 110); "><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">                                        </span></span>// Cosine Property</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(92, 38, 153); "><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">                                        </span>[</span>DTGraphDatasourceProperty<span style="color: #000000"> </span><span style="color: #2e0d6e">propertyWithName</span><span style="color: #000000">:</span><span style="color: #c41a16">@"Cosine"</span><span style="color: #000000">&nbsp;<span class="Apple-style-span" style="color: rgb(170, 13, 145); "><span style="color: #2e0d6e">andKey</span>:<span style="color: #675b42">kTrignometricModelCosineProperty</span>],&nbsp;</span></span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(103, 91, 66); "><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">                                        </span>[</span><span style="color: #5c2699">NSNumber</span><span style="color: #000000"> </span><span style="color: #2e0d6e">numberWithInteger</span><span style="color: #000000">:</span>kTrignometricModelCosineProperty<span style="color: #000000">],</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(113, 109, 110); "><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">                                        </span></span>// Tangent Property</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(92, 38, 153); "><span style="color: #000000"><span class="Apple-tab-span" style="white-space:pre">                                        </span>[</span>DTGraphDatasourceProperty<span style="color: #000000"> </span><span style="color: #2e0d6e">propertyWithName</span><span style="color: #000000">:</span><span style="color: #c41a16">@"Tangent"<font class="Apple-style-span" color="#000000">&nbsp;</font><span class="Apple-style-span" style="color: rgb(170, 13, 145); "><span style="color: #2e0d6e">andKey</span>:<span style="color: #675b42">kTrignometricModelTangentProperty</span>],&nbsp;</span></span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space:pre">                                        </span>[<span style="color: #5c2699">NSNumber</span> <span style="color: #2e0d6e">numberWithInteger</span>:<span style="color: #675b42">kTrignometricModelTangentProperty</span>],<span class="Apple-tab-span" style="white-space:pre">        </span><span style="color: #aa0d91">nil</span>];<span class="Apple-tab-span" style="white-space:pre">                </span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space:pre">        </span><span style="color: #aa0d91">return</span> availableProperties;</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; ">}</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(92, 38, 153); "><span style="color: #000000">+ (</span>MyObjectProperty<span style="color: #000000"> *)propertyForKey:(</span><span style="color: #000000"><span class="Apple-style-span" style="color: rgb(63, 110, 116); ">MyObjectPropertyKey</span>)k {</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(46, 13, 110); "><span style="color: #aa0d91"><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" color="#000000">        </font></span>return</span><span style="color: #000000"> [[</span><span style="color: #1a7680">TrignometricModel</span><span style="color: #000000"> </span>availableProperties<span style="color: #000000">] </span>objectForKey<span style="color: #000000">:[</span><span style="color: #5c2699">NSNumber</span><span style="color: #000000"> </span>numberWithInteger<span style="color: #000000">:k]];</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; ">}</div><div><br></div><div><span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" face="Helvetica" size="3"><span class="Apple-style-span" style="font-size: 12px;">I'm not sure what's happened to the colour syntax there, however, the problem is that I want a default property key, as other objects in the framework need to pass those property keys between functions. So initially i thought I could define a base enum type containing a default (this is the&nbsp;<span class="Apple-style-span" style="color: rgb(63, 110, 116); font-family: Monaco; font-size: 10px; ">MyObjectPropertyKey<span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; ">&nbsp;type), and then in the class that conforms to the protocol, that enum could be extended to contain the custom keys. This way the rest of the framework can use the base enum type in method defininitions.</span></span></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" face="Helvetica" size="3"><span class="Apple-style-span" style="font-size: 12px;"><br></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" face="Helvetica" size="3"><span class="Apple-style-span" style="font-size: 12px;">However, I'm not sure that extending an enum is possible (in C). Does anyone have any thoughts? Does the above even make sense? Anyway, thanks again for reading this far.</span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" face="Helvetica" size="3"><span class="Apple-style-span" style="font-size: 12px;"><br></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" face="Helvetica" size="3"><span class="Apple-style-span" style="font-size: 12px;">Cheers</span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" face="Helvetica" size="3"><span class="Apple-style-span" style="font-size: 12px;">Dan</span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" face="Helvetica" size="3"><span class="Apple-style-span" style="font-size: 12px;"><br></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" face="Helvetica" size="3"><span class="Apple-style-span" style="font-size: 12px;"><br></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" face="Helvetica" size="3"><span class="Apple-style-span" style="font-size: 12px;"><br></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" face="Helvetica" size="3"><span class="Apple-style-span" style="font-size: 12px;"><br></span></font></div><div><br></div></span></div></span></font></div></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><font class="Apple-style-span" color="#AA0D91"><br></font></div><div><font class="Apple-style-span" color="#AA0D91" face="Monaco" size="2"><br></font></div></div></body></html>