Objective-C Programming | Categories | Classes

Objective-C categories is a feature of the SDK that allows developers like us to add new methods to existing Cocoa Touch classes like NSString or NSNumber without subclassing. The procedure to add new methods is quite easy and is demonstrated in this tutorial. Adding methods to an existing class is known as extending a class can be seen as inheritance which is a Object-Oriented-Programming (OOP) concept.

Create a Project


The best way to teach how to add new methods is to show you, so create a Single View application. The project will add a method to the NSNUmber class to calculate compound interest. The method will be called from the UI View Controller.

Once the project is setup, add a new class to your project from the Objective-C category section, refer to Fig. 1, as a subclass of the NSNumber class. You will need to either select or search for the NSNumber class from the list in the drop down field (fig 2). Call the subclass: InterestRate.

Figure 1 : Create a Category Subclass
Figure 1 : Create a Category Subclass
Figure 2 : Select NSNumber for Category
Figure 2 : Select NSNumber for Category

Open the newly created header file. Notice the new class syntax, NSNumber (InterestRate), the custom subclass name is appended to the NSNumber class and enclosed in parentheses. Also notice the header and implementation file names which consist of the class name with the subclass name appended with a plus symbol: NSNumber+InterestRate.h & .m

So this is saying that we will use the NSNumber as the super class and we will add our own method(s) to the class, which will only be visible from this project.

While in the header file, add a new method called interestRate with the following arguments:

  • (double)principal
  • (int)frequency
  • (double)interest
  • (float)term

The complete method signature is provided below:

-(double)interestRate
 :(double)principal
 :(int)frequency
 :(double)interest
 :(float)term;

Next switch to the implementation file so that add the code to the interestRate method. The code is quite simple, depending on the frequency, it applies a compounding interest rate formula and returns the amount that includes the value of the principal at a given period in time. Next we will implement this new method and call it like any other NSNumber method.

The interestRate Method Code

-(double)interestRate:(double)principal:(int)frequency:(double)interest:(float)term{
    
    double rate=0.0;
    double compound=0.0;
    switch (frequency) {
        case 0:
                        
            rate = pow((1+((interest/100)/12)), (12*term));
            
            
            compound = principal *  rate;
            break;
        case 1:
            rate = pow((1+((interest/100)/4)), (4*term));
            compound = principal * rate;
            
        default:
            rate = pow((1+((interest/100))), (term));
            compound = principal * rate;
            
            break;
    }

    
    
    
    return compound;
    
}

Using the NSNumber interestRate Method


Before getting to the code in the view controller, we will need to setup the UI in the storyboard so that it resembles the following screenshot (Fig. 3). As you can see, there are four fields, the first three are editable. The last one is used to display the compounded amount so its not enabled (uncheck the enabled attribute in the Attributes inspector).

The compounded amount will be calculated based on the UISegmentedControl selection. For this example, I have set the style in the Attributes inspector to “Bar” and incremented the number of segments and uncheck the “selected” attribute so that there wouldn’t be any defaulted values when the app runs.

Select each segment, again in the Attributes inspector and change the title as follows:

0-Month
1-Quarter
2-Year

The last bit of business is to create IBOutlets and IBAction for the UI controls in the storyboard. Select the ViewControlller (not the UIView) by clicking on the utility bar at the top of the ViewController (you should see a blue contour) and select the Editor assistant to open the header file next to the storyboard, check out the screenshot (Fig. 4) below for an example.

Next Crtrl+Drag a connection from each of the fields to the header file, between the @interface and @end directives. When you release the mouse button the connection line disappears and is replaced with a popover. Enter the name for the field starting with a lowercase letter which is a coding convention. Leave the type as IBOutlet. Name the fields as follows:

  1. principal
  2. interest
  3. term
  4. earnedInterest


Repeat the same operation for the UISegmentedControl, however change the connectiontype to IBAction and accept the default values. Name the control “frequency”. All that is needed now is to call the interestRate method in the NSNumber class and display the calculated value.

Figure 3 : UI Layout
Figure 3 : UI Layout
Figure 4 : UISegmentedControl Configuration
Figure 4 : UISegmentedControl Configuration
Notice
Notice that you cannot create a NSNumber+InterestRate object or an InterestRate since they don’t exist in the Code Assist and will generate an error. Instead create a NSNumber variable.

Implement View Controller


Open the View Controller header for your project and add an import statement for the NSNumber+InterestRate header file. The header will already contain the various @properties that we created in the previous section but we will also need to create a NSNumber variable, called compoundInterest, so that we can call our custom method.

In the implementation, locate the frequency IBAction method and add the following code:

The frequency Code


- (IBAction)frequency:(id)sender {
    
    int selectedFreq = [(UISegmentedControl*)sender selectedSegmentIndex];
    
   self.earnedInterest.text = [NSString stringWithFormat:@"%2f",
                          [compoundInterest interestRate
                                 :[self.principal.text doubleValue] 
                                 :selectedFreq 
                                 :[self.interest.text doubleValue] 
                                 :[self.term.text doubleValue]] ] ;
}

The selectedFreq is an int and is assigned the value of the UISegmentedControl selected segment. This will be passed as an argument to the interestRate method. To assign the return value of the method to the earnedInterest UItextField we will need to get the string representation using the stringWithFormat method and passing in the format value “%2f” to indicate that we are going to provide a float or double value.

Notice that the Code Assist recognizes the interestRate method as a method of the compoundedInterest NSNumber variable as if it was an integral part of the class. Each of the arguments corresponds to a value from each of the input fields that we defined earlier, except of course for the selectedFreq variable. Since these values are text based we will need to get the corresponding numerical value using the appropriate conversion method. Since all of the field inout arguments are doubles, we will use the doubleValue method. NSNumber has a conversion for each numerical data type.

That is it, once the values are passed to the method and calculated, the return value is displayed in the earnedInterest field. For the sake of simplicity I didn’t add any error checking which would be required in an production grade app. Also the purpose of the app was to demonstrate how ro create a Category so I didn't spend too much time on debugging and testing this app.

In Summary


This is a nice way to implement new functionality to an existing class and make use of OOP’s coding design features. As I mentioned before this method is only visible to the current project. To make visible other projects, you will need to add the custom subclass NSNumber+InterestRate to the project that will use the method(s).

More by this Author


Comments

No comments yet.

    Sign in or sign up and post using a HubPages Network account.

    0 of 8192 characters used
    Post Comment

    No HTML is allowed in comments, but URLs will be hyperlinked. Comments are not for promoting your articles or other sites.


    Click to Rate This Article
    working