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

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

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

    หลังจากที่เราได้เริ่มมีพื้นฐานการเขียนโปรแกรมด้วยภาษา Objective-C เช่นการเรียนคลาส ประกาศเมธอด ในบทนี้เราจะก้าวเข้าสู่การใช้งานของ Cocoa Framework ซึ่งเป็นหัวใจหลักสำคัญในการเขียนโปรแกรมด้วยภาษา Objective-C แต่ ก่อนจะเริ่มส่วนที่สองของหนังสือเล่มนี้ เราควรทำความรู้จักกับเฟรมเวิร์ก (Framework) กันสักนิดว่าคืออะไร “เฟรมเวิร์ก” สำหรับ Mac OS X แล้วหมายถึงการนำเอา Library ต่างๆมารวมไว้กัน เหมือนกับการเอาหนังสือเรื่องแสง, แรงโน้มถ่วง และ โมเมนตั้ม มาแพ็ครวมกันแล้วเรียกว่าหนังสือเหล่านี้เป็นหนังสือฟิสิกส์

     

    ถ้ายังจำกันได้ในบทแรกๆ เกี่ยวกับประวัติความเป็นมาของ Objective-C หลังจากที่ Apple ตกลงซื้อ NEXTSTEP ก็ได้นำเอาเฟรมเวิร์กของบริษัท NEXTSTEP มาใช้งานและพัฒนาใหม่กลายเป็น Cocoa ดังนั้นชื่อของคลาสต่างๆเฟรมเวิร์กส่วนมากจึงขึ้นต้น

    ด้วย NS ซึ่งเป็นตัวย่อของ NEXTSTEP นั่นเอง นอกจากนี้แล้ว Apple ยังมีเฟรมเวิร์กอีกตัวคือ Carbon ซึ่งเป็น Framework ของภาษา C แต่ได้หยุดการพัฒนาตั้งแต่ปี 2012 หลังจากออก Mac OS 10.8

     

    สิ่งที่จะเรียนรู้ในบทนี้คือการใช้ Foundation Framework ซึ่งเป็นเฟรมเวิร์กพื้นฐาน เช่นการใช้ตัวเลข สตริง วันที่ หรือ อาเรย์ ในการเรียกการใช้งานเฟรมเวิร์กพื้นฐานนี้สามารถทำได้โดยการใช้ #import <Foundation/Foundation.h> พูดได้ว่าแทบจะทุกโปรแกรมจะต้องรวมไฟล์นี้เข้าไปด้วยเสมอ

     

    Number

    ในบทที่ผ่านมา ถ้าหากเราต้องใช้ข้อมูลแบบตัวเลข เราก็จะประกาศตัวแปรให้เป็น int , char , double เป็นต้น ตัวแปรที่เราได้ประกาศไปทั้งหมดนี้เป็นตัวแปรที่เรียกว่า Primitive Type ไม่ใช่ตัวแปรแบบ Object ถึงตรงนี้อาจจะเกิดคำถามในใจว่าแล้วทำไมต้องทำเป็นอ๊อบเจ็กให้ยุ่งยากด้วย ประการแรกก็คือเรากำลังเขียนโปรแกรมเชิงวัตถุ ประการที่สองก็คืออ๊อบเจ็กทำให้เราสามารถส่ง message หาได้ (เรียกใช้เมธอดของอ๊อบเจ็กได้นั่นเอง) ยกตัวอย่างที่พบเห็นง่ายๆเช่น ถ้าต้องการจะเปลี่ยนตัวเลขให้เป็นตัวอักษร เพื่อนำไปใช้งานอย่างอื่น เราต้องเขียนโค้ดเพื่อแปลงค่าจาก int , double , float และอื่นๆให้เป็นตัวอักษร ขึ้นมาเองซึ่งเสียเวลา อย่างที่สามก็คือคลาสอื่นๆในกลุ่มของ Foundation มีการทำงานเกี่ยวข้องกับอ๊อบเจ็ก เป็นต้นว่าถ้าหากจะเก็บตัวเลขหลายๆค่าใน NSArray เราไม่สามารถใช้ตัวแปรแบบ int , float ได้ ต้องเป็นอ๊อบเจ็กเท่านั้น คลาสแรกของ Foundation Framwork ที่จะใช้กันนั่นก็คือคลาส NSNumber ซึ่งเป็นคลาสที่เอาไว้ใช้เก็บค่าตัวเลข



    Program 8.1

    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
    39
    40
    41
    42
    43
    44
    
    //  main.m
    //  Number
    //
    //  Created by Ter on 2/9/13.
    //  Copyright (c) 2013 Objective-C Book. All rights reserved.
    //
     
    #import <Foundation/Foundation.h>
     
    int main(int argc, const char * argv[])
    {
     
        @autoreleasepool {
     
            NSNumber* charNumber = [[NSNumber alloc] initWithChar:'a'];
            NSNumber* intNumber = [[NSNumber alloc] initWithInt:100];
            NSNumber* integerNumber = [[NSNumber alloc] initWithInteger:200];
            NSNumber* floatNumber = [[NSNumber alloc] initWithInteger:3.214];
            NSNumber* longNumber = [[NSNumber alloc] initWithLong:0x12ADF];
     
     
            NSLog(@"char %@",charNumber);
            NSLog(@"int %@",intNumber);
            NSLog(@"integer %@",integerNumber);
            NSLog(@"float %@",floatNumber);
            NSLog(@"long %@n",longNumber);
     
     
            NSLog(@"char %c",[charNumber charValue]);
            NSLog(@"integer %d",[intNumber intValue]);
            NSLog(@"int %ld",[integerNumber integerValue]);
            NSLog(@"float %f",[floatNumber floatValue]);
            NSLog(@"long %ld",[longNumber longValue]);
     
     
            [charNumber release];
            [intNumber release];
            [integerNumber release];
            [floatNumber release];
            [longNumber release];
     
        }
        return 0;
    }

     

    Program 8.1 Output

    char 97
    int 100
    integer 200
    float 3
    long 76511

     

    char a
    integer 100
    int 200
    float 3.000000
    long 76511

     

    @autoreleasepool

    ก่อนจะอธิบายโปรแกรม มาดูในส่วนโค้ดที่แปลกตากันสักหน่อยนั่นก็คือ @autoreleasepool เมื่ออ่านชื่อก็พอจะเดาได้ว่ามันก็คือ Autorelease Pool นั่นเอง โปรแกรมในบทก่อนๆที่ผ่านมาเราได้ใช้ NSAutoreleasePool กันเป็นหลักและทุกๆครั้งที่เขียนโปรแกรมก็ต้องประกาศ Autorelease Pool เสมอ ในปัจจุบันคอมไพลเลอร์รุ่นใหม่ จึงได้เพิ่มความสะดวกให้นักพัฒนาไม่ต้องเขียน NSAutoreleasePool กันให้ยุ่งยาก เพียงแต่ใช้ @autoreleasepool { } แทน NSAutoreleasePool เท่านั้นเอง

     

    กลับมาต่อด้วยโค้ดของโปรแกรม 8.1 ได้แสดงการใช้งาน NSNumber อย่างคร่าวๆ โปรแกรมข้างบนเราได้ประกาศอ๊อบเจ็กทั้งหมด 5 ตัวด้วยกัน และเราก็ไดกำหนดค่าเริ่มต้นให้กับอ๊อบเจ็กแต่ละตัวต่างกันเช่น charNumber เป็นตัวอักษร ‘a’ และ floatNumber เป็นค่า 3.214 ถ้าสังเกตุบรรทัดที่ 16 กับ 17

     

    16
    17
    
            NSNumber* intNumber = [[NSNumber alloc] initWithInt:100];
            NSNumber* integerNumber = [[NSNumber alloc] initWithInteger:200];

     

    จะเห็นว่าเป็นค่าจำนวนเต็มทั้งคู่ แต่สิ่งที่แตกต่างกันคือบรรทัด 16 นั้นจะใช้ initWithInt โดยรับค่าแบบ int ส่วนบรรทัดที่ 17 เรียกใช้ initWithInteger โดยรับค่าแบบ NSInteger แต่อย่าเพิ่งเข้าใจผิดคิดว่า NSInteger นั้นเป็นอ๊อบเจ็กเพราะเห็นว่าขึ้นต้นด้วย NS เพราะแท้จริงแล้ว NSInteger นั้นเป็นเพียง typedef ในภาษา C เท่านั้น

     

    การใช้ NSInteger มีข้อดีคือถ้าหากเป็นระบบ 32 bits คอมไพล์เลอร์จะแปลง NSInteger ให้เป็น 32 bits Integer ส่วนคอมพิวเตอร์ 64 bits ก็จะแปลงให้เป็น 64 bits Integer แล้วเมื่อไหร่ควรจะใช้ int หรือ NSInteger ? คำตอบคือขึ้นอยู่กับความจำเป็น เช่นสมมติว่าปัจจุบันโปรแกรมเราเขียนเป็นแบบ 32 Bits ซึ่งอาจจะต้องเก็บค่าจำนวนเต็มใหญ่มากๆ เราจึงคิดเผื่อว่าวันหนึ่งเกิดย้ายระบบจาก 32 Bits ไปยัง 64 Bits โปรแกรมก็จะสามารถเก็บค่าจำนวนเต็มได้เท่ากับ 64 Bits ซึ่งทำให้ได้ใช้ประสิทธิภาพของระบบได้เต็มที่ อีกกรณีคือตัวแปรแบบ Pointer ในระบบ 32 และ 64 มีขนาดไม่เท่ากัน ดังนั้นเพื่อความมั่นใจได้ว่าเมื่อย้ายโค้ดจากระบบ 32 Bits ไปยัง 64 Bits จะไม่เกิดปัญหาขนาดของ Pointer ที่ต่างกัน อย่างไรก็ตามอีกหลายกรณีก็ไม่มีความจำเป็นที่จะใช้ NSInteger เช่นถ้าเรารู้อยู่แล้วว่าค่าของตัวแปรมีค่าในช่วงตั้งแต่ 0 – 250 การใช้ NSInteger ก็ไม่ได้เกิดประโยชน์เลย กลับกลายเป็นใช้ตัวแปรที่มีขนาดใหญ่เกินความจำเป็น

     

    กลับมายังโค้ดของเราต่อเมื่อดูการใช้งาน NSLog จะเห็นว่าโปรแกรมได้แบ่งออกเป็นสองส่วนด้วยกัน โดยส่วนแรกจะใช้ %@ เพื่อใช้ในการแสดงอ๊อบเจ็ก แต่ถ้าต้องการจะกำหนดให้แสดงค่าในแบบที่ต้องการก็ทำได้เช่นกัน ยกตัวอย่างเช่นบรรทัด 22 และ 29

     

    22
    
            NSLog(@"char %@",charNumber);
    29
    
            NSLog(@"char %c",[charNumber charValue]);

     

    โค้ดบรรทัด 22 ใช้ %@ เป็นการแสดงค่าของอ๊อบเจ็กโดยตรงโปรแกรมจึงแสดงค่า 96 ซึ่งเป็นค่า ASCII Code ของตัวอักษร a ส่วนโค้ดบรรทัด 29 เรียก charValue เพื่อที่จะได้ค่าที่เป็นแบบ char ดังนั้นเราจึงใช้ %c เพื่อการแสดงค่า char ผลลัพธ์ที่แสดงทางหน้าจอจึงเป็นตัวอักษร a

     

    การเปรียบเทียบค่า NSNumber ไม่สามารถทำได้โดยใช้ == เหมือนอย่าง primitive type หากต้องการจะเปรียบเทียบค่าต้องใช้เมธอด isEqualToValue: ในการเปรียบเทียบ ดังเช่นตัวอย่างโค้ดโปรแกรม 8.2

     

    Program 8.2

    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
    
    //
    //  main.m
    //  Number2
    //
    //  Created by Ter on 2/10/13.
    //  Copyright (c) 2013 Objective-C Book. All rights reserved.
    //
     
    #import <Foundation/Foundation.h>
     
    int main(int argc, const char * argv[])
    {
     
        @autoreleasepool {
     
            NSNumber* firstNumber = [NSNumber numberWithInt:90];
            NSNumber* secondNumber = [[NSNumber alloc] initWithFloat:90.0];
     
            if( [firstNumber isEqualToNumber:secondNumber])
                NSLog(@"%@ is equal to %@",firstNumber, secondNumber);
     
            [secondNumber release];
     
        }
        return 0;
    }

     

    Program 8.2 Output

    90 is equal to 90

     

    โปรแกรม 8.2 เป็นการเปรียบเทียบ NSNumber สองจำนวนซึ่งตัวแรกประกาศเป็นแบบจำนวนเต็มมีค่าเท่ากับ 90 ส่วนตัวที่สองเป็นจำนวนทศนิยม 90.0 เมื่อเปรียบเทียบจึงมีค่าเท่ากัน นอกจากนี้แล้วการประกาศ NSNumber ก็มีความแตกต่างกันเพราะ firstNumber ใช้ class method ในการประกาศ ส่วน secondNumber ใช้ instance method ปกติแล้วคลาสทุกคลาสใน Foundation ถ้ามีคลาสนั้นมี class method เพื่อใช้ในการประกาศอ๊อบเจ็ก อ๊อบเจ็กที่ได้จากจะเป็นแบบ autorelease ดังนั้นแล้วเราจึงไม่ต้องเรียก release เมื่อสิ้นสุดการใช้งาน

     

    เมื่อพิจารณา numberWithInt ( class method ) และ initWithInt ( instance method ) ก็จะเห็นว่าชื่อของเมธอดทั้งสองมีความคล้ายกันเป็นอย่างมาก ถึงเราจะยังไม่ได้เปิดคู่มือ Reference ก็สามารถที่จะเดาได้ว่า ถ้าต้องการจะประกาศ NSNumber ที่เก็บ Unsigned Long ด้วยคลาสเมธอด ก็น่าจะมีเมธอดที่ชื่อ numberWithUnsignedLong และเมื่อเราเปิดดู Reference ก็พบว่ามีเมธอดนี้อยู่ดังรูป

     

     
    image001

     

     

    เมื่อได้ศึกษาเกี่ยวกับ Foundation Framework มากชึ้นก็จะพบว่าคลาสอื่นๆใน Foundation Framework จะมีการตั้งชื่อ instance method และ class method ที่ออกแบบเป็นลักษณะแบบนี้เช่นเดียวกัน

     

    String

    Foundation Framwork มีคลาสที่เกี่ยวข้องกับสตริงอยู่ด้วยกัน 2 คลาสหลักๆคือ NSString และ NSMutableString จริงๆแล้วโปรแกรม Hello World ที่ได้เขียนไปตั้งแต่บทแรกนั้น เราได้เริ่มใช้สตริงไปแล้ว แต่อยู่ในรูปแบบของ constance string เช่น @”Hello World” เป็นต้น การประกาศ constance string ในภาษา Objective-C มีความคล้ายคลึงกับภาษา C เพียงแค่เพิ่มสัญลักษณ์ @ นำหน้าสตริงเท่านั้นเอง ถึงจะมีรูปแบบที่คล้ายกันแต่ภาษา C สตริงเป็นเพียงกลุ่มของข้อมูลแบบ char ที่เรียงต่อเท่านั้น ตัวอักษรที่แสดงด้วย char นี้จะเรียกว่า ASCII เนื่องจาก char เก็บค่าต่างๆได้เพียง 1 byte หรือ 255 ค่า ทำให้การแสดงตัวอักษรต่างๆทำได้จำกัด การแสดงผลภาษาอื่นๆเช่นภาษาไทย ต้องเขียนโค้ดขึ้นมาเอง ส่วนสตริงใน Objective-C เก็บข้อมูลในรูปแบบ unichar ซึ่งเป็นข้อมูลตัวอักษรแบบหลายไบต์ ทำให้เพียงพอที่จะเก็บอักระของภาษาต่างๆได้มากมายเช่นภาษาไทย ภาษาจีน หรือภาษาอื่นๆ และสิ่งที่พิเศษเมื่อประกาศ constance string ในภาษา Objective-C จะเป็นการประกาศสตริงอ๊อบเจ็ก ไม่ใช่เพียงแค่กลุ่มของ unichar

     

    Program 8.3

    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
    
    //
    //  main.m
    //  String1
    //
    //  Created by Ter on 2/10/13.
    //  Copyright (c) 2013 Objective-C Book. All rights reserved.
    //
     
    #import <Foundation/Foundation.h>
     
    int main(int argc, const char * argv[])
    {
     
        @autoreleasepool {
     
            NSString* hello = [[NSString alloc] initWithString:@"Hello World"];
            NSString* text = @"Objective-C";        
            NSString* textClassMethod = [NSString stringWithString:text];
     
            NSLog(@"%@ n%@ n%@", hello , text , textClassMethod);
     
            [hello release];
     
        }
        return 0;
    }

     

    Program 8.3 Output

    Hello World
    Objective-C
    Objective-C

     

    ตัวอย่างโค้ดโปรแกรม 8.3 แสดงการใช้งานคลาส NSString เราได้ประกาศ NSString ทั้งหมด 3 อ๊อบเจ็กด้วยกัน แต่ใช้วิธีการต่างกัน โดย hello เรียกใช้ initWithString ส่วน text ประกาศแบบ constance string และตัวสุดท้าย textClassMethod เรียกใช้คลาสเมธอด stringWithString

     

    Basic String methods

    คลาส NSString มีเมธอดพื้นต่างๆให้ใช้งานค่อนข้างจะครบถ้วน เช่น การเปรียบเทียบสตริง การเปลี่ยนตัวเป็นพิมพ์ใหญ่ พิมพ์เล็ก การหาค่าความยาวของสตริง ดังเช่นตัวอย่าง

     

    Program 8.4

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    
    #import <Foundation/Foundation.h>
     
    int main(int argc, const char * argv[])
    {
     
        @autoreleasepool {
     
            NSNumber* number = [NSNumber numberWithInt:30];
     
            NSString* stringA = @"Hello";
            NSString* stringB = @"World";
     
            NSString* stringX;
            NSString* stringY;
            NSString* stringZ;
            NSString* stringW;
     
            NSLog(@"stringA %@",stringA);
            NSLog(@"stringB %@",stringB);
     
            // Copy String
            stringX = [NSString stringWithString:stringA];
     
            // Is equal
            if( [stringA isEqualToString:stringX])
                NSLog(@"stringA is equal to stringX");
            else
                NSLog(@"stringA is not equal to stringX");
     
            // Compare
            NSComparisonResult compareResult;
            compareResult = [stringA compare:stringB];
            if( compareResult == NSOrderedSame)
                NSLog(@"Same");
            else if( compareResult == NSOrderedAscending)
                NSLog(@"Ascending");
            else
                NSLog(@"Decending");
     
            NSLog(@"%@",[stringA uppercaseString ]);
            NSLog(@"%@",[stringA lowercaseString ]);
     
            // Convert number to string
            stringZ = [number stringValue];
            NSLog(@"stringZ %@",stringZ);
     
            // Length
            NSLog(@"stringA length: %ld",[stringA length]);
     
            // Create new string with format
            stringY = [NSString stringWithFormat:@"%@ %@ %@",stringA ,stringB , number];
            NSLog(@"stringY %@",stringY);
     
            // Concat
            stringW = [stringA stringByAppendingString:stringB];
            NSLog(@"stringW %@",stringW);
     
        }
        return 0;
    }

     

    Program 8.4 Output

    stringA Hello
    tringB World
    stringA is equal to stringX
    Ascending
    HELLO
    hello
    stringZ 30
    stringA length: 5
    stringY Hello World 30
    stringW HelloWorld

     

    โปรแกรม 8.4 ได้แสดงถึงการใช้งานเมธอดพื้นฐานต่างๆของสตริง จากโค้ดของโปรแกรมหากต้องการเปรียบเทียบสตริง เราสามารถเลือกใช้ isEqualToString หรือ compare ก็ได้ แต่ในการเปรียบเทียบค่าว่าเท่ากันหรือไม่การใช้ isEqualToString จะสะดวกกว่า แต่ถ้าต้องการเปรียบเทียบแบบเรียงลำดับตัวอักษรต้องใช้เมธอด compare ในการเปรียบเทียบ

     

    การแปลงข้อมูลตัวเลขเป็นตัวอักษรก็มีเมธอดให้ใช้งาน ดังเช่นโค้ดบรรทัดที่ 44 เป็นการแปลง NSNumber ให้เป็น NSString โดยเรียกใช้ stringValue เห็นได้ว่าการเปลี่ยนตัวเลขเป็นตัวหนังสือ หรือตัวหนังสือเป็นตัวเลข ทำได้ง่ายมากๆ หรือการเปลี่ยนให้เป็นพิมพ์ใหญ่หรือพิมพ์เล็กก็ทำได้อย่างสะดวก การสร้างสตริงใหม่โดยกำหนดรูปแบบ ( format string ) ก็ทำได้ไม่ยาก ดังเช่นบรรทัดที่ 51 เราได้นำ stringA StringB และ number มาใช้สร้างสตริงใหม่ และส่วนสุดท้ายบรรทัดที่ 55 เราได้สร้างสตริงใหม่จากการนำ stringA มาต่อด้วย stringB

     

    Immutable & Mutable String

    ตามที่ได้กล่าวไปแล้วว่าสตริงใน Objective-C นั้นจะแบ่งออกเป็น NSString (Immutable) และ NSMutableString (Mutable) คำว่า Immutable ก็คือเปลี่ยนแปลงไม่ได้ ส่วน Mutable คือเปลี่ยนแปลงค่าได้ ฉะนั้นแล้วโค้ดที่ได้เขียนไปใน 8.4 ก็เป็นการใช้ สตริงแบบ Immutable หรือเป็นสตริงแบบเปลี่ยนแปลงไม่ได้นั่นเอง เพราะว่าเราประกาศเป็นคลาส NSString ทั้งหมด แต่เมื่อย้อยกลับไปดูโค้ดบรรทัดที่

     

    40
    
            NSLog(@"%@",[stringA uppercaseString ]);

     

    อาจจะเกิดข้อสงสัยว่า ก็ในเมื่อเราประกาศ NSString ซึ่งเป็น Immutable ที่แก้ไขไม่ได้ แล้วทำไม stringA ถึงได้เปลี่ยนแปลงข้อมูลจาก Hello กลายเป็นอักษรพิมพ์ใหญ่ HELLO

     

    ความเป็นจริงแล้ว stringA ไม่ได้เกิดการเปลี่ยนข้อมูลในตัวเอง แต่สิ่งเกิดขึ้นก็เมื่อเรียกใช้ uppercaseString คือ stringA จะไปสร้างสตริงใหม่ที่เป็นตัวพิมพ์ใหญ่ แล้วส่งสตริงอ๊อบเจ็กใหม่กลับมาให้
     

    ดังนั้นเราจึงเห็นผลลัพธ์ที่หน้าจอเป็นคำว่า HELLO นั่นเอง

     

    ใน Foundation Framework มีคลาส NSMutableString เพื่อสร้างสตริงที่สามารถเปลี่ยนแปลงค่าในภายหลังได้ การใช้งานพื้นฐานของคลาสนี้แทบจะเหมือนกับ NSString ทุกอย่าง

     

     

    Program 8.5

    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
    
    #import <Foundation/Foundation.h>
     
    int main(int argc, const char * argv[])
    {
     
        @autoreleasepool {
     
            NSMutableString* stringA = [NSMutableString stringWithString:@"Hello"];
            NSLog(@"%@",stringA);
     
            // Set new string
            [stringA setString:@"Objective-C"];
            NSLog(@"%@",stringA);
     
            // Append string
            [stringA appendString:@" is fun !!!"];
            NSLog(@"%@",stringA);
     
            // Replace string
            NSRange fullRange = NSMakeRange(0, [stringA length]);
            [stringA replaceOccurrencesOfString:@"!"
                                     withString:@"*"
                                        options:NSLiteralSearch
                                          range:fullRange];
            NSLog(@"%@",stringA);
     
            // Delete character
            NSRange range = NSMakeRange(3, 7);
            [stringA deleteCharactersInRange:range];
            NSLog(@"%@",stringA);
     
        }
        return 0;
    }

     

    Program 8.5 Output

    Hello
    Objective-C
    Objective-C is fun !!!
    Objective-C is fun ***
    ObjC is fun ***

     

     

    จากโค้ดของโปรแกรม เราได้ประกาศ stringA เป็นแบบ NSMutableString และเรียกเมธอด ที่เกี่ยวข้องกับการแก้ไขสตริงเช่น setString เพื่อใช้ในการเปลี่ยนสตริงใหม่ หรือ appendString เพื่อนำสตริงใหม่มาต่อท้าย ส่วนโค้ดตั้งแต่บรรทัดที่ 20

     

    20
    21
    22
    23
    24
    
            NSRange fullRange = NSMakeRange(0, [stringA length]);
            [stringA replaceOccurrencesOfString:@"!"
                                     withString:@"*"
                                        options:NSLiteralSearch
                                          range:fullRange];

     

    เป็นการแทนสตริง ! ด้วย * โดยเริ่มต้นที่ 0 โดยกำหนดระยะในการค้นหาเท่ากับจำนวนตัวอักษรทั้งหมดของ stringA พูดง่ายๆก็คือเริ่มต้นตั้งแต่ตัวแรกไปถึงตัวสุดท้าย ส่วน NSLiteralSearch เป็น option ที่กำหนดว่าให้หาไปทีละตัวโดยต้องตรงกันทั้งหมดหมายความว่าตัวอักษรพิมพ์ ใหญ่หรือเล็กจะแตกต่างกัน ( ยังมี option อื่นๆอีกเช่น NSCaseInsensitiveSearch เพื่อกำหนดว่าตัวพิมพ์ใหญ่หรือพิมพ์เล็กมีค่าเท่ากัน ) และสุดท้ายเรียกใช้ deleteCharactersInRange เพื่อลบตัวอักษรโดยเริ่มจากตำแหน่ง 3 โดยมีขนาดความยาว 7 ตัวอักษร

     

    28
    29
    
            NSRange range = NSMakeRange(3, 7);
            [stringA deleteCharactersInRange:range];

     

    image_10

     

    ในเมื่อ NSMutableString เปลี่ยนแปลงค่าได้และใช้งานได้เหมือนกับ NSString ทุกอย่าง งั้นเราควรจะประกาศให้เป็น NSMutableString ทั้งหมดเลยดีกว่าไหม ? คำตอบคือ “ไม่ควร” เพราะ NSString นั้นมีประสิทธิภาพดีกว่า NSMutableString และบางกรณีเช่น parameter ของเมธอดควรใช้ NSString เพื่อป้องกันการเปลี่ยนแปลงค่าของ parameter จากการทำงานภายในเมธอดโดยไม่ได้ตั้งใจ

     

     

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

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

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