ArtsAutosBooksBusinessEducationEntertainmentFamilyFashionFoodGamesGenderHealthHolidaysHomeHubPagesPersonal FinancePetsPoliticsReligionSportsTechnologyTravel

Objective-C Programming | Categories | Classes

Updated on August 4, 2012

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).

Comments

    0 of 8192 characters used
    Post Comment

    No comments yet.

    working

    This website uses cookies

    As a user in the EEA, your approval is needed on a few things. To provide a better website experience, hubpages.com uses cookies (and other similar technologies) and may collect, process, and share personal data. Please choose which areas of our service you consent to our doing so.

    For more information on managing or withdrawing consents and how we handle data, visit our Privacy Policy at: https://hubpages.com/privacy-policy#gdpr

    Show Details
    Necessary
    HubPages Device IDThis is used to identify particular browsers or devices when the access the service, and is used for security reasons.
    LoginThis is necessary to sign in to the HubPages Service.
    Google RecaptchaThis is used to prevent bots and spam. (Privacy Policy)
    AkismetThis is used to detect comment spam. (Privacy Policy)
    HubPages Google AnalyticsThis is used to provide data on traffic to our website, all personally identifyable data is anonymized. (Privacy Policy)
    HubPages Traffic PixelThis is used to collect data on traffic to articles and other pages on our site. Unless you are signed in to a HubPages account, all personally identifiable information is anonymized.
    Amazon Web ServicesThis is a cloud services platform that we used to host our service. (Privacy Policy)
    CloudflareThis is a cloud CDN service that we use to efficiently deliver files required for our service to operate such as javascript, cascading style sheets, images, and videos. (Privacy Policy)
    Google Hosted LibrariesJavascript software libraries such as jQuery are loaded at endpoints on the googleapis.com or gstatic.com domains, for performance and efficiency reasons. (Privacy Policy)
    Features
    Google Custom SearchThis is feature allows you to search the site. (Privacy Policy)
    Google MapsSome articles have Google Maps embedded in them. (Privacy Policy)
    Google ChartsThis is used to display charts and graphs on articles and the author center. (Privacy Policy)
    Google AdSense Host APIThis service allows you to sign up for or associate a Google AdSense account with HubPages, so that you can earn money from ads on your articles. No data is shared unless you engage with this feature. (Privacy Policy)
    Google YouTubeSome articles have YouTube videos embedded in them. (Privacy Policy)
    VimeoSome articles have Vimeo videos embedded in them. (Privacy Policy)
    PaypalThis is used for a registered author who enrolls in the HubPages Earnings program and requests to be paid via PayPal. No data is shared with Paypal unless you engage with this feature. (Privacy Policy)
    Facebook LoginYou can use this to streamline signing up for, or signing in to your Hubpages account. No data is shared with Facebook unless you engage with this feature. (Privacy Policy)
    MavenThis supports the Maven widget and search functionality. (Privacy Policy)
    Marketing
    Google AdSenseThis is an ad network. (Privacy Policy)
    Google DoubleClickGoogle provides ad serving technology and runs an ad network. (Privacy Policy)
    Index ExchangeThis is an ad network. (Privacy Policy)
    SovrnThis is an ad network. (Privacy Policy)
    Facebook AdsThis is an ad network. (Privacy Policy)
    Amazon Unified Ad MarketplaceThis is an ad network. (Privacy Policy)
    AppNexusThis is an ad network. (Privacy Policy)
    OpenxThis is an ad network. (Privacy Policy)
    Rubicon ProjectThis is an ad network. (Privacy Policy)
    TripleLiftThis is an ad network. (Privacy Policy)
    Say MediaWe partner with Say Media to deliver ad campaigns on our sites. (Privacy Policy)
    Remarketing PixelsWe may use remarketing pixels from advertising networks such as Google AdWords, Bing Ads, and Facebook in order to advertise the HubPages Service to people that have visited our sites.
    Conversion Tracking PixelsWe may use conversion tracking pixels from advertising networks such as Google AdWords, Bing Ads, and Facebook in order to identify when an advertisement has successfully resulted in the desired action, such as signing up for the HubPages Service or publishing an article on the HubPages Service.
    Statistics
    Author Google AnalyticsThis is used to provide traffic data and reports to the authors of articles on the HubPages Service. (Privacy Policy)
    ComscoreComScore is a media measurement and analytics company providing marketing data and analytics to enterprises, media and advertising agencies, and publishers. Non-consent will result in ComScore only processing obfuscated personal data. (Privacy Policy)
    Amazon Tracking PixelSome articles display amazon products as part of the Amazon Affiliate program, this pixel provides traffic statistics for those products (Privacy Policy)