<html><body bgcolor="#FFFFFF"><div>categories are similar to extension methods perhaps<br><br>On Apr 20, 2010, at 10:59 AM, Duane Wandless &lt;<a href="mailto:duane@wandless.net">duane@wandless.net</a>&gt; wrote:<br><br></div><div></div><blockquote type="cite"><div><blockquote style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;" class="gmail_quote">In the particular case of NSArray and NSMutableArray our runtime has 
been extended to natively convert NSArrays to C# arrays and back so the 
only code that we bound is the required interop code for NSArray.<br></blockquote><br>That is an interesting strategy and is limiting (I think).&nbsp; How I use NSMutableArrays is to populate them in C# then send then to the native obj-c UI NSArrayControllers, etc.&nbsp; I then can manipulate the array in C# and the UI updates as expected.&nbsp; If the only bindings exposed are to convert from a List to NSArray then this use would not be possible.<br>
<br><blockquote style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;" class="gmail_quote">Many bits from Foundation make sense for Objective-C programmers as they
 are dealing with a low-level language and are redundant with C#.<br></blockquote><div><br>I believe this statement is not true, given how I use NSArrays.&nbsp; I need to be able to manipulate the underlying object so the UI is automatically updated. <br>
</div><br><blockquote style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;" class="gmail_quote"><div>We do not currently support a mapping to categories as they do not 
really have a counter part in C#.</div></blockquote>
<br>I may be too simple... but I view a category as nothing but additional methods on the class.&nbsp; But I may be missing some nuance of a category.<br><br>At a minimum I believe the bindings must expose the addObject, insertObject, remove etc selectors on the arrays.<br>
<br>Duane<br><br><div class="gmail_quote">On Tue, Apr 20, 2010 at 10:03 AM, Miguel de Icaza <span dir="ltr">&lt;<a href="mailto:miguel@novell.com"><a href="mailto:miguel@novell.com">miguel@novell.com</a></a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Hello Duane,<br><br><div class="gmail_quote"><div class="im"><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">I have taken parser.cs and extended it to handle categories.&nbsp; To start I
 tested parsing NSArray.h.&nbsp; This produced NSArray.cs and 
NSMutableArray.cs.&nbsp; I have "full" bindings for these obj-c classes.&nbsp; <br></blockquote><div><br></div></div><div>We do not currently support a mapping to categories as they do not really have a counter part in C#.</div>

<div><br></div><div>They are *similar* to interfaces, but they can be interfaces with optional components so there is no direct mapping to them.</div><div><br></div><div>For the delegate pattern we settled on classes that have been labeled as "Models" (read more about that on our binding page).</div>
<div class="im">
<div><br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">NSMutableArray:&nbsp; <a href="http://monobin.com/__m335d328c" target="_blank"><a href="http://monobin.com/__m335d328c">http://monobin.com/__m335d328c</a></a><br>

NSArray:&nbsp; <a href="http://monobin.com/__m36c66b6e" target="_blank"><a href="http://monobin.com/__m36c66b6e">http://monobin.com/__m36c66b6e</a></a></blockquote><div><br></div></div><div>Nice. &nbsp;For the particular case of Foundation, we have taken an approach to only bind what is actually *required* as opposed to binding everything. &nbsp; Many bits from Foundation make sense for Objective-C programmers as they are dealing with a low-level language and are redundant with C#.</div>

<div><br></div><div>In the particular case of NSArray and NSMutableArray our runtime has been extended to natively convert NSArrays to C# arrays and back so the only code that we bound is the required interop code for NSArray.</div>

<div><br></div><div>So we suggest to work instead on the AppKit bindings.</div><div class="im"><div><br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
However
 not all the bindings generated are valid.&nbsp; For example I do not know 
how to generate a binding for this selector (note I do not use this 
selector, just an example):<br>
- (void)sortUsingFunction:(NSInteger (*)(id, id, void *))compare 
context:(void *)context;<br></blockquote><div><br></div></div><div>Correct, the parser does the heavy lifting, but requires human intervention to fix the output.</div><div class="im"><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

<br>Then comes the question of 
constructors.&nbsp; Take these two (the 2nd is not really a constructor I know) from NSMutableArray for example:<br>+ 
(id)arrayWithCapacity:(NSUInteger)numItems;<br>
- (id)initWithCapacity:(NSUInteger)numItems;<br><br>My parser 
exposes these as:<br><br>&nbsp;&nbsp;&nbsp;
 &nbsp;&nbsp;&nbsp; [Static]<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [Export ("arrayWithCapacity:")]<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 
IntPtr ArrayWithCapacity (uint numItems);<br>
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [Export ("initWithCapacity:")]<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; IntPtr 
InitWithCapacity (uint numItems);<br></blockquote><div><br></div></div><div>This is a great question.</div><div><br></div><div>Factory methods should be declared as static methods, and we *typically* use the FromXXXX or CreateXXX naming pattern for them, so the above would look like this:</div>

<div><br></div><div>[Static, Export ("arrayWithCapacity:")]</div><div>NSArray CreateArray (int items);</div><div><br></div><div>Notice that I took the liberty of changing the uint to int because that makes the method CLS compliant. &nbsp;&nbsp;</div>

<div><br></div><div>In this case it is a debatable change as there could be arrays with more than 2 gig elements, but in many other places in the API this is not the case, uint has been used to get an extra bit that is not required.</div>

<div><br></div><div>So how can we support the extra 2 gigs of elements while still allowing other languages the most common use case? &nbsp;We keep the signature as it was originally produced, and introduce a new overload:</div>

<div><br></div><div>[Static, Export ("arrayWithCapacity:")]</div><div><div>NSArray CreateArray (uint items);</div><div><br></div></div><div>And then on a helper class in Foundation/NSArray.cs we would do:</div>
<div>
<br></div><div>partial class NSArray {&nbsp;</div><div>&nbsp;&nbsp; &nbsp; static NSArray CreateArray (int items){</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (items &lt; 0) throw new ArgumentException ();</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return CreateArray ((uint) items);</div>

<div>&nbsp;&nbsp; &nbsp; }</div><div>}</div><div><br></div><div>Now to the second question:</div><div class="im"><div><br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
First I do not think returning 
an IntPtr is correct.&nbsp; It should return NSMutableArray.&nbsp; But IntPtr 
follows what was started with MT.&nbsp; Returning an IntPtr will require 
calling GetNSObject which seems cumbersome.&nbsp; Unless I'm missing 
something.<br></blockquote><div><br></div></div><div>In the specific case of *constructors* &nbsp;the binding generator recognizes the pattern:</div><div><br></div><div>IntPtr Constructor (ARGS)</div><div><br></div><div>As being the constructor for the class. &nbsp; This is required because constructors generate different code than regular method bindings.</div>

<div><br></div><div>So you will see in all of our APIs that we expose that pattern, but that this is never translated into an actual exposed IntPtr, it is always translated into the correct method name.</div><div><br></div>
<font color="#888888">
<div>Miguel.</div></font></div>
</blockquote></div><br>
</div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>Mono-osx mailing list</span><br><span><a href="mailto:Mono-osx@lists.ximian.com">Mono-osx@lists.ximian.com</a></span><br><span><a href="http://lists.ximian.com/mailman/listinfo/mono-osx">http://lists.ximian.com/mailman/listinfo/mono-osx</a></span><br></div></blockquote></body></html>