รับทําเว็บไซต์ รับทําseo
 
รับทําเว็บไซต์ รับทําseo
บทความที่น่าสนใจ

บทความ ที่น่าสนใจ

Objective-C : Foundation Framework (ตอนที่2)

    Searching String

    คลาส NSString และ NSMutableString ได้เตรียมเมธอดเพื่อใช้ในการค้นหาสตริง หรือการแยกสตริง (Substring) ในการค้นหาสตริงเราสามารถกำหนดรูปแบบการค้นหาได้เช่นเดียวกับการแทนที่สตริง ดังโค้ดตัวอย่างด้านล่าง

     

    Program 8.6

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    
    #import <Foundation/Foundation.h>
     
    int main(int argc, const char * argv[])
    {
     
        @autoreleasepool {
     
            NSRange rang;
            NSString* resultText;
            NSString* text = @"String objects represent character strings in Cocoa frameworks.\n"
                              "Representing strings as objects allows you to use strings\n"
                              "wherever you use other objects\n";
     
            NSLog(@"%@",text);
     
            // Search string
            rang = [text rangeOfString: @"Cocoa"];
            NSLog (@"String is at index %lu",rang.location);
     
            rang = [text rangeOfString: @"Cocoa Touch"];
            if( rang.location == NSNotFound )
                NSLog (@"String does not found");
            else
                NSLog (@"String is at index %lu",rang.location);
     
            // Substring 
            resultText = [text substringToIndex: 14];
            NSLog (@"First 14 chars of text: %@", resultText);
     
            resultText = [text substringFromIndex: 20];
            NSLog (@"String from index 20 : %@", resultText);
     
            resultText = [text substringWithRange: NSMakeRange (10, 4)];
            NSLog (@"String from index 20-26: %@", resultText);
     
        }
        return 0;
    }

    Program 8.6 Output

    String objects represent character strings in Cocoa frameworks.
    Representing strings as objects allows you to use strings
    wherever you use other objects

    String is at index 46
    String does not found
    First 14 chars of text: String objects
    String from index 20 : sent character strings in Cocoa frameworks.
    Representing strings as objects allows you to use strings
    wherever you use other objects
    String from index 20-26: ects

     

    การกำหนดค่าเริ่มต้นให้กับสตริงในกรณีที่สตริงยาวมากๆ เราสามารถตัดแบ่งบรรทัด ได้ดังเช่นการประกาศ text (บรรทัดที่ 10-12) จากโค้ดตัวอย่าง โปรแกรมได้แสดงการหาสตริงที่ต้องการโดยการเรียกใช้เมธอด rangeOfString

     

    20
    21
    22
    23
    24
    
            rang = [text rangeOfString: @"Cocoa Touch"];
            if( rang.location == NSNotFound )
                NSLog (@"String does not found");
            else
                NSLog (@"String is at index %lu",rang.location);

     

    ถ้าโปรแกรมค้นหาสตริงที่เราต้องการเจอก็จะได้ NSRang กลับมาซึ่งเป็น data structure ที่ประกอบไปด้วย location และ lenght เราสามารถใช้ rang.location แสดงตำแหน่งนั้นได้ แต่ถ้าหากไม่เจอค่า location จะเป็นค่า NSNotFound

     

    Display data via NSLog

    คลาสของ Foundation ต่างๆ สามารถใช้ %@ ผ่าน NSLog เพื่อแสดงค่าของอ๊อบเจ็กนั้นได้ทุกๆคลาส เช่น NSNumber หรือ NSString ทั้งสองคลานี้ใช้ %@ เหมือนกัน เราก็สามารถที่จะเขียนคลาสขึ้นมาใหม่และใช้ %@ ได้เช่นเดียวกันกับคลาสใน Foundation วิธีการคือเราจะทำการ Overriding Method ที่ชื่อว่า

     

    - (NSString *)description;

     

    เราจะเขียนโปรแกรมขึ้นมาใหม่โดยประกาศคลาสชื่อ Product

     

    Program 8.7

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    //  Product.h
     
    #import <Foundation/Foundation.h>
     
    @interface Product : NSObject
    {
        NSMutableString* _name;
        float _price;
    }
     
    -(void) setName:(NSString*) name andPrice:(float) price;
     
    @end

    คลาส Product ที่เราได้ประกาศขึ้นมานี้ประกอบไปด้วย class member อยู่ด้วยกัน 2 ตัวคือ _name ที่ประกาศเป็น NSMutableString และ _price เป็น float หลังจากนั้นก็ประกาศเมธอดเพื่อใช้ในการกำหนดค่าให้กับตัวแปรของคลาส

    เมื่อเสร็จสิ้นจากการประกาศคลาสแล้ว สิ่งที่ต้องทำต่อไปคือ การเขียนส่วนของ implement ซึ่งมีโค้ดดังนี้

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    
    //  Product.m
     
    #import "Product.h"
     
    @implementation Product
    -(id) init
    {
        self = [super init];
        if( self != nil)
        {
            _name = [[NSMutableString alloc] init];
            _price = 0;
        }
        return self;
    }
    -(void) setName:(NSString*) name andPrice:(float) price
    {
        [_name setString:name];
        _price = price;
    }
     
    -(NSString*) description
    {
        return [NSString stringWithFormat:@"%@ %.2f",_name,_price ];
    }
     
    -(void) dealloc
    {
        [_name release];
        [super dealloc];
    }
    @end

     

    โค้ดของเมธอด init ได้จองหน่วยความจำให้กับตัวแปรต่างๆภายในคลาส และในส่วนของเมธอด setName:andPrice ที่ใช้ในการกำหนดค่าของตัวแปร สังเกตุว่าเราใช้ NSString เพื่อป้องกันการเปลี่ยนค่าของพารามีเตอร์ที่รับเข้ามา และมาถึงส่วนที่สำคัญของโปรแกรม

     

    22
    23
    24
    25
    
    -(NSString*) description
    {
        return [NSString stringWithFormat:@"%@ %.2f",_name,_price ];
    }

     

    โค้ดส่วนนี้เราได้ override เมธอด description โดยส่งค่าสตริงที่เรากำหนดขึ้นมาใหม่ กลับไปยังคนที่เรียกเมธอดนี้ ที่เหลือก็คือเขียนโค้ดส่วนการทำงานของโปรแกรมหลัก

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    #import <Foundation/Foundation.h>
    #import "Product.h"
     
    int main(int argc, const char * argv[])
    {
     
        @autoreleasepool {
     
            Product* pinkFurby = [[Product alloc] init];
            Product* redFurby = [[Product alloc] init];
     
            [pinkFurby setName:@"Pink Furby" andPrice:2900];
            [redFurby setName:@"Red Furby" andPrice:3000];
     
            NSLog(@"%@\n%@",pinkFurby , redFurby);
     
            [pinkFurby release];
            [redFurby release];
     
        }
        return 0;
    }

     

    เพียงเท่านี้เราก็สามารถใช้ %@ เหมือนอย่าง Foundation ได้และเมื่อทำงานโปรแกรมก็จะแสดงผลออกมาดังนี้

    Program 8.7 Output

    Pink Furby 2900.00
    Red Furby 3000.00

     

     

    Autorelease object & init

    โปรแกรมของเราทำงานได้เสร็จสมบูรณ์เรียบร้อยแล้ว แต่เราจะทำการปรับปรุงคลาสของเราให้ใช้งานได้ง่ายขึ้นเหมือนกับคลาสของ Foundation โดยที่เราจะเพิ่มการกำหนดค่าตั้งต้นให้กับคลาสตั้งแต่ตอนประกาศตัวแปร และเพิ่มคลาสเมธอดเพื่อใช้สร้างอ๊อบเจ๊กเช่นกันกับ Foundation ให้เพิ่มโค้ดในส่วนของ interface ด้วยโค้ดข้างล่างนี้

     

    +(Product*) productWithName:(NSString*)name andPrice:(float)price;
    -(id) initWithName:(NSString*)name andPrice:(float) price;

     

    ในส่วนของ implementation โค้ดจะมีหน้าตาดังนี้

     

    -(id) initWithName:(NSString*)name andPrice:(float) price
    {
        self = [super init];
        if( self != nil)
        {
            _name = [[NSMutableString alloc] initWithString:name];
            _price = price;
        }
        return self;
    }
     
     
    +(Product*) productWithName:(NSString*)name andPrice:(float)price
    {
    	return [[[Product alloc] initWithName:name andPrice:price] autorelease];
    }

     

    สิ่งที่ได้เขียนเพิ่มเข้าไปคือ initWithName: andPrice เพื่อให้คลาสสามารถสร้างอ๊อบเจ็กและกำหนดค่าเริ่มต้นได้ตั้งแต่ตอนสร้าง ทำให้คลาสของเราใช้งานได้สะดวกมากขึ้น และยิ่งไปกว่านั้นเราได้เพิ่มคลาสเมธอดเพื่อสร้าง instance ของ product ซึ่งช่วยอำนวยความสะดวกในกรณีที่ต้องการจะสร้าง autorelase object อีกด้วย ดูตัวอย่างการใช้งานในโปรแกรม 8.8

     

    Program 8.8

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    #import <Foundation/Foundation.h>
    #import "Product.h"
     
    int main(int argc, const char * argv[])
    {
     
        @autoreleasepool {
     
            Product* pinkFurby = [[Product alloc] init];
            [pinkFurby setName:@"Pink Furby" andPrice:2900];
     
            Product* redFurby = [[Product alloc] initWithName:@"Red Furby" andPrice:3000];
            Product* greenFurby = [Product productWithName:@"Green Furby" andPrice:3200];
     
            NSLog(@"%@\n%@\n%@",pinkFurby , redFurby,greenFurby);
     
            [pinkFurby release];
            [redFurby release];
     
        }
        return 0;
    }

    Program 8.8 Output

    Pink Furby 2900.00
    Red Furby 3000.00
    Green Furby 3200.00

     

    อ๊อบเจ๊ก pinkFurby ใช้เมธอด setName:andPrice ดั้งเดิมที่เราได้เขียนกันไปก่อนหน้านี้ ส่วน redFurby ได้กำหนดค่าให้ตั้งแต่ตอนประกาศด้วยการเรียก initWithName:andPrice และส่วนสุดท้ายเราได้สร้าง greenFurby โดยการใช้คลาสเมธอด productWithName: แม้อ๊อบเจ๊กทั้งสามนี้ทำงานได้เหมือนกัน แต่แตกต่างกันในการเรียกเมธอดเพื่อสร้างและอ๊อบเจ็กที่ได้ก็แตกต่างกันใน เรื่องของคืนหน่วยความจำแบบ autorelease

บทความที่น่าสนใจ

บทความ ล่าสุด

บทความ ความรู้ด้านไอที, คอมพิวเตอร์ Techonlogy, Gadget, ความรู้เกี่ยวกับคอมพิวเตอร์ กับทาง SoftMelt.com