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

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

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

    ในบทผ่านมาเราได้เรียนรู้กับ Foundation Framework กันไปบ้างแล้วนั่นก็คือ NSString , NSMutableString และ NSScaner ส่วนในบทนี้เราจะเรียนรู้กับคลาส Collection ต่างๆที่มีใน Foundation Framework แล้วคอลเลคชั่นคืออะไร ? คอลเลคชั่นก็คือคลาสหรือโครงสร้างของข้อมูลที่รวบรวมหรือจัดเก็บคลาสอื่นๆ พูดง่ายๆก็คือเป็นคลาสที่สามารถเก็บอ๊อบเจ็คต่างๆไว้ได้ โดยมีการกำหนดรูปแบบในการจัดเก็บ เช่น จัดเก็บแบบระบุตำแหน่งหรือใช้ key ในการอ้างที่จัดเก็บเป็นต้น

     

    Array

    การจัดเก็บข้อมูลพื้นที่ง่ายและใช้กันมากที่สุดก็คือ Array อาร์เรย์เป็นคลาสที่เก็บข้อมูลแบบระบุตำแหน่งโดยใช้ตัวเลข (index) เมื่อเราต้องการจะจัดเก็บข้อมูลต้องระบุตำแหน่งว่าจะนำข้อมูลนั้นไปไว้ยัง ตำแหน่งใดของอาร์เรย์ เมื่อต้องการจะนำข้อมูลออกมาใช้ก็ต้องระบุตำแหน่งที่ต้องการเช่นเดียวกัน เปรียบเสมือนลิ้นชักเก็บเอกสารเมื่อเราต้องการจะจัดเก็บเอกสาร ก็ต้องกำหนดว่าจะเก็บไว้ที่ชั้นใด เมื่อต้องการเอกสารคืนก็ต้องรู้ตำแหน่งของชั้นที่เราเก็บไว้

     

    ใน Foundation Framework มีคลาสอาร์เรย์ด้วยกัน 2 คลาสคือ immutable และ mutable เช่นเดียวกับคลาสสตริงที่เราได้ลองใช้งานกันไปในบทที่แล้ว สำหรับคลาสแรกที่จะได้ลองเขียนโปรแกรมกันก็คือ NSArray เป็นคลาสแบบ immutable ไม่สามารถเปลี่ยนแปลงแก้ไขใดๆได้ ดังนั้นการกำหนดค่าให้กับอาร์เรย์ต้องทำตั้งแต่การประกาศตัวแปร

     

    Program 9.1

    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>
     
    int main(int argc, const char * argv[])
    {
     
        @autoreleasepool {
     
            NSArray *daysName = [[NSArray alloc] initWithObjects:@"Sunday"
                                 , @"Monday", @"Tuesday", @"Wednesday" 
                                 , @"Thursday" , @"Friday"
                                 , @"Saturday", nil];
     
            for ( int i = 0 ; i < 7 ; i++)
            {
                NSString* day = [daysName objectAtIndex:i];
                NSLog(@"%@", day);
            }
     
            [daysName release];
        }
        return 0;
    }

     

    โปรแกรม 9.1 แสดงตัวอย่างการใช้งาน NSArray เริ่มต้นด้วยการประกาศอ๊อบเจ็ค daysName ซึ่งเป็น NSArray การประกาศอาร์เรย์นี้ได้กำหนดค่าเริ่มต้นของอาเรย์ด้วยเมธอด initWithObjects: พร้อมกับค่าสตริงค่าแรกนั่นก็คือ Sunday หลังจากนั้นตามด้วยเครื่องหมาย , (Commar) คั่นตัวแปรเพื่อที่เราจะได้กำหนดค่าในลำดับต่อไปนั่นคือ Monday และไล่ลำดับไปเรื่อยๆจนถึง Satuday ซึ่งเป็นตัวสุดท้าย เนื่องจากเมธอด initWithObjects: สามารถกำหนดค่าเริ่มต้นได้อย่างไม่จำกัด เมธอดนี้จึงได้กำหนดให้ปิดท้ายด้วย nil เพื่อบอกให้รู้ว่าสิ้นสุดการกำหนดค่าเริ่มต้นของอาร์เรย์

     

    อ๊อบเจ็คต่างๆที่เราได้ใส่เข้าไปจะถูกเรียงตามลำดับก่อนหลังโดยอัตโนมัติ เช่น Sunday จะอยู่ในตำแหน่งแรกสุดและตัวถัดไปคือ Monday หมายเลขของตำแหน่งต่างๆในอาร์เรย์จะเริ่มต้นที่ 0 จากโค้ดของโปรแกรมเรากำหนดค่าของ array ด้วยกันทั้งหมด 7 ค่า เพราะฉะนั้นแล้ว index ก็จะเริ่มที่ 0 ไปจนถึงตัวสุดท้ายก็คือ 6

     

    ตอนนี้เราได้ให้กำหนดค่าอาร์เรย์เรียบร้อยแล้ว เมื่อต้องการจะใช้ค่าที่เราได้เก็บไว้ก็ใช้เมธอด objectAtIndex: พร้อมกับตำแหน่งที่ต้องการและผลลัพธ์ของโปรแกรมก็แสดงที่คอนโซลดังนี้

     

    Program 9.1 Output

    Sunday
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday

     

    ในกรณีที่เราระบุตำแหน่งเกินขอบเขตของ array เช่นโปรแกรม 9.1 ถ้าหากเปลี่ยนเงื่อนไข for loop จาก i < 7 ให้เป็น i < 8 โปรแกรมจะเกิดข้อผิดพลาดและหยุดทำงาน พร้อมกับแจ้งข้อความบอกว่าตำแหน่งที่เราได้ระบุไปเกินขอบเขตของอาร์เรย์

     

    *** Terminating app due to uncaught exception ‘NSRangeException’, reason: ‘*** -[__NSArrayI objectAtIndex:]: index 7 beyond bounds [0 .. 6]‘

     

    ดังนั้นแล้วสิ่งที่ต้องระวังเป็นอย่างมากในการใช้ array ก็คือการระบุตำแหน่งของ array ห้ามเกินขอบเขตโดยเด็ดขาด นอกจากนี้แล้วในการระบุตำแหน่งของ array ต้องเป็นจำนวนเต็มเท่านั้น ไม่สามารถใช้ทศนิยมได้เช่น 1.0

     

    NSString* day1 = [daysName objectAtIndex:1];    // OK
    NSString* day2 = [daysName objectAtIndex:2.0];  // Wrong

     

    NSMutableArray

    โปรแกรมที่เพิ่งได้ทดลองเขียนไปจะพบว่าเราไม่สามารถที่จะเพิ่มหรือลบ ข้อมูลใน array ได้ เนื่องจาก NSArray เป็นคลาสแบบ immutable ไม่สามารถเปลี่ยนแปลงได้และต้องกำหนดค่าให้กับอาร์เรย์ตั้งแต่เริ่มต้น คลาส NSMutableArray เป็นคลาสที่อนุญาติให้แก้ไขเพิ่มสมาชิกได้ จึงมีความยืดหยุ่นมากกว่า

     

    Program 9.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
    27
    28
    29
    30
    31
    32
    33
    34
    
    #import <Foundation/Foundation.h>
     
    int main(int argc, const char * argv[])
    {
     
        @autoreleasepool {
     
            NSMutableArray* fruits = [[NSMutableArray alloc] initWithObjects:@"Apple",
                                      @"Lemon", nil];
     
            [fruits addObject:@"Orange"];
            [fruits addObject:@"Banana"];
     
            for ( int i = 0 ; i < 4 ; i++ )
            {
                NSLog(@"%@", [fruits objectAtIndex:i]);
            }
     
            [fruits removeObjectAtIndex:1];
     
            NSLog(@"-----------");
            for ( int i = 0 ; i < [fruits count] ; i++ )
            {
                NSLog(@"%@", [fruits objectAtIndex:i]);
            }
     
            NSLog(@"-----------");
     
            NSLog(@"%@", fruits);
     
            [fruits release];
        }
        return 0;
    }

     

    โปรแกรมใช้เมธอด initWithObjects: เพื่อกำหนดค่าเริ่มต้นให้กับอาร์เรย์ได้เช่นกันเดียวกันกับ NSArray (NSMutableArray เป็นซับคลาสของ NSArray) หลังจากนั้นใช้เมธอด addObject: เพิ่มอ๊อบเจ็คสตริง Orange และ Banana ในตอนนี้ fruits ก็จะมีจำนวนสมาชิกด้วยกันทั้งหมด 4 อ๊อบเจ็คนั่นก็คือ Apple , Lemon , Orange และ Banana

     

    โค้ดส่วนต่อมาบรรทัดที่ 14 คือ for loop เมื่อลูปทำงานก็จะแสดงข้อมูลต่างๆในอาเรย์ด้วย NSLog และหลังลูปทำงานจบก็ได้ลบข้อมูลในตำแหน่งที่ 1 ด้วยเมธอด removeObjectAtIndex: ดังน้ันอ๊อบเจ็คที่ถูกลบก็คือ Lemon

     

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

     

    Program 9.2 Output

    Apple
    Lemon
    Orange
    Banana
    ———-
    Apple
    Orange
    Banana
    ———-
    (
    Apple,
    Orange,
    Banana
    )

     

    จาก Output จะเห็นว่าการแสดงสมาชิกทุกตัวใน NSArray นอกจากใช้ลูปแล้ว เราสามารถใช้ NSLog แสดงค่าสมาชิกทั้งหมดได้เช่นเดียวและเขียนโค้ดเพียงบรรทัดเดียวเท่าน้ัน

     

    Sorting Arrays

    มินิโปรเจคที่เราได้เขียนไปถ้ามีปริมาณข้อมูลจำนวนมาก การดูข้อมูลต่างๆคงไม่สะดวกมากนัก เราอาจจะใช้การจัดลำดับของข้อมูลเพื่อให้เกิดความสะดวกสะบายมากยิ่งขึ้น เช่น จัดลำดับข้อมูลโดยการเรียงตามตัวอักษรหรือราคาสินค้า โชคดีที่การจัดเรียงลำดับข้อมูลใน NSMutableArray ทำได้ค่อนข้างง่ายเพราะสามารถที่จะใช้เมธอดที่ชื่อ sortUsingSelector: เป็นตัวช่วยในการเปรียบเทียบระหว่างอ๊อบเจ็คได้ เมื่อดูที่ API Reference เขียนอธิบายไว้ดังนี้

     

    api

     

    API ได้อธิบายไว้ว่าคือเมธอด sortUsingSelector: นี้รับพารามิเตอร์เป็น SEL (selector) ซึ่ง selector นี้เป็นเมธอดที่ใช้ในการเปรียบลำดับระหว่างสมาชิกในอาเรย์ และเมธอดนี้จะใช้กับสมาชิกทุกๆตัวพร้อมกับพารามิเตอร์ที่เป็นอ๊อบเจ็คในการ เปรียบเทียบลำดับ เมธอดที่ได้กำหนดให้เป็นตัวเปรียบเทียบลำดับต้องส่งค่า NSOrderAscedngin ในกรณีที่น้อยกว่า ส่งค่า NSOrderDescending ในกรณีที่มากกว่า และส่งค่า NSOrderedSame ในกรณีที่ค่าเท่ากัน

     

    ดังนั้นสิ่งที่เราต้องเขียนเพิ่มเติมก็คือเขียนเมธอดที่ใช้ในการเปรียบเทียบลำดับนั่นเอง ให้เพิ่มเมธอดในคลาส Book ดังนี้

     

    -(NSComparisonResult) compareByName:(Book*) other;

     

    จากที่ API กำหนดมา เมธอดที่ใช้เพื่อเปรียบเทียบต้องส่งค่า NSOrderedSame หรืออื่นๆ เราจึงใช้ NSComparisonResult เพราะเนื่องจาก NSOrderedSame เป็น emum type ของ NSCompareisonResult นั่นเอง นอกจากนี้ต้องรับ parameter ซึ่งจะเป็นอ๊อบเจ็คที่ใช้ในการเปรียบเทียบ จากนั้นให้เขียนโค้ดในส่วนของการทำงาน

     

    -(NSComparisonResult) compareByName:(Book*) other
    {
        NSComparisonResult result = [_name compare:other.name];
        return result;
    }

     

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

     

    -(void) sort;

     

    และส่วน implement ก็มีโค้ดสั้นๆดังนี้

     

    -(void) sort
    {
        [_books sortUsingSelector: @selector(compareByName:)];
    }

     

    จากนั้นเราก็จะเรียกเมธอดที่ได้เขียนไปในโปรแกรมของเรา เช่นตัวอย่าง

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    #import <Foundation/Foundation.h>
    #import "Book.h"
    #import "BookController.h"
     
    int main(int argc, const char * argv[])
    {
     
        @autoreleasepool {
     
            BookController* comic = [[BookController alloc] init];
            [comic dataFromXMLFile:@"manga.xml"];
            [comic dataFromXMLFile:@"comic.xml"];
            [comic list];
     
            // Sort
            [comic sort];
            [comic list];
     
            [comic release];
     
        }
        return 0;
    }

     

    Program Output

    Berserk 50.00 (5)
    Doraemon 45.00 (8)
    Dragonball 30.00 (4)
    GTO 35.00 (5)
    Hunter 40.00 (18)
    Naruto 40.00 (15)
    Pokemon 25.00 (2)
    —————

     

    ถึงตรงนี้คงพอจะเริ่มเห็นประโยชน์ของความเป็นภาษา dynamic และการใช้ selector ของภาษา Objective-C มากขึ้น

     

    เมธอดต่างๆของอาเรย์ยังมีให้ใช้อีกมากมาย ซึ่งหนังสือเล่มนี้ไม่สามารถอธิบายการใช้งานได้ครบทุกๆอย่าง ฉะนั้นที่เหลือก็คือหน้าที่ของผู้ที่อ่านที่ต้องศึกษาเพิ่มเติมด้วยตัวเอง จาก API Reference

     

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

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

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