Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 4 của 4
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Yes, ^ là cách khai báo con trỏ hàm trong Objective C (hiểu theo C). Nó tương tự như anonymous function trong Java, hay Lambda trong C++/C# vậy, trong C++ nó cũng có thể được hiểu là predicate.

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trong Objective C, nếu bạn sử dụng dấu ^ như trên gọi là Block (một cái tên khác gọi là Memory Block). Vấn đề này rất khó giải thích rõ ràng cho bạn (Nói chung là một memory block nếu bạn nắm vững về bộ nhớ sẽ hiểu ngay). Nếu bạn biết về lập trình C, bạn cũng có thể hiểu nó với ý nghĩa như bạn rox_rook.

    Nếu bạn sử dụng dấu ^ như trên nhưng ở dạng: a ^= b; hoặc r = a ^ b; lúc này ^ có ý nghĩa là XOR như trong lập trình C chứ không phải ý nghĩa trên!

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Dấu "^" là để khai báo 1 block, chính là 1 con trỏ hàm.
    Cách sử dụng
    - Hàm bình thường:
    Mã:
    void printMessage (void) {
      NSLog (@"Programming is fun."); 
    }
    - Block giống chức năng với function trên
    Mã:
    ^(void) {
      NSLog (@"Programming is fun."); 
    }
    - Block được gán vào 1 tên biến
    Mã:
    void (^printMessage)(void) = ^(void){
      NSLog (@"Programming is fun."); 
    };
    - Gọi:
    Mã:
    printMessage ();
    - Block gần giống như 1 hàm nên cũng có giá trị trả về:
    Mã:
    int (^gcd) (int, int) = ^(int u, int v){
      int temp;
      while ( v != 0 ) {
        temp = u % v; u = v;
        v = temp;
      }
      return u; 
    };
    - Block tiện hơn hàm ở chổ có thể viết bên trong hàm, ngoài hàm, locally hoặc globally
    Mã:
    #import <Foundation/Foundation.h>
    // Block to calculate the nth triangular number
    void (^calculateTriangularNumber) (int) = ^(int n) {
      int i, triangularNumber = 0;
      for ( i = 1; i <= n; ++i ) 
         triangularNumber += i; 
      NSLog (@"Triangular number %i is %i", n, triangularNumber); 
    };
    int main (int argc, char *argv[]) {
      NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
      calculateTriangularNumber (10); 
      calculateTriangularNumber (20); 
      calculateTriangularNumber (50);
      [pool drain]; 
      return 0;
    }
    - Block có thể truy nhập các biến bên trong phạm vi (scope) block được khai báo, chỉ truy nhập, không thể sửa đổi:
    Mã:
    #import <Foundation/Foundation.h>
    int main (int argc, char *argv[]) {
      NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
      int foo = 10;
      void (^printFoo)(void) = ^(void) {
         NSLog (@"foo = %i", foo); };
      foo = 15; 
      printFoo ();
      [pool drain]; 
      return 0;
    }
    Cuốn programming in objective-c 2.0 nói rất rõ vấn đề này.
    Bạn nên tìm đọc để hiểu rõ hơn.
    Chúc thành công.

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •