2014-04-23 12 views
9

Tôi có một trường hợp chuyển đổi như thế này:iOS không thể alloc đối tượng mới trong trường hợp chuyển đổi

switch ([weatherCode intValue]) { 
     case 1: 
      ... 
      break; 
     case 2: 
      .... 
      break; 
    } 

Nhưng tôi muốn alloc một đối tượng trong trường hợp đó, như NSString *string = @"hello";

nhưng nó giữ cho tôi một lỗi expect expression mà tôi không hiểu những gì đang xảy ra ở tất cả. Hãy giúp tôi.

Cảm ơn.

+0

Tất cả các báo cáo trong tất cả các trường hợp của một câu lệnh switch nằm trong phạm vi tương tự, vì vậy khi bạn khai báo một biến với một tên trong một trường hợp, và sau đó bạn khai báo một biến với cùng tên trong một trường hợp khác, bạn đang thực hiện khai báo hai lần một cách hiệu quả. Lỗi không có trong phân bổ hoặc định nghĩa, nó nằm trong phần khai báo. Bạn có thể sử dụng các dấu ngoặc nhọn để tạo một phạm vi mới trong mỗi trường hợp, hoặc bạn chỉ khai báo biến của bạn một lần, trước 'chuyển', và hoãn gán cho đến khi' trường hợp'. – iluvcapra

Trả lời

70

aha ...

tôi đã cùng một vấn đề trước đây, chỉ cần thêm một {} trong trường hợp của bạn, tất cả các vấn đề của bạn sẽ được giải quyết.

Chẳng hạn như:

switch ([weatherCode intValue]) { 
    case 1: 
    { 
     ... 
    } 
     break; 
    case 2: 
    { 
     ... 
    }   
    break; 
} 

Hy vọng rằng sẽ giúp.

+4

Tôi đã hoàn thành với mục tiêu C/Xcode BS. – Tommyixi

+0

^^^^^^^^^^^^^^^^ –

+0

giải pháp tuyệt vời: D –

7

Bạn cần niềng răng nếu bạn muốn khởi tạo biến:

switch ([weatherCode intValue]) { 
     case 1:{ 
      NSString *string = @"hello"; 
     } 
     break; 
     case 2: { 
      .... 
     } 
     break; 
    } 
2

Sử dụng một số niềng răng:

switch ([weatherCode intValue]) { 
     case 1:{ 
      NSString *string = @"hello"; 
     } 
      break; 
     case 2:{ 
      NSString *string = @"hello"; 
     } 
      break; 
    } 
3

Hãy thử làm việc đó như thế này:

switch ([weatherCode intValue]) { 
    case 1: { 
     ... 
    } 
    break; 
    case 2: { 
     .... 
    } 
    break; 
    ... 

}

1

Trong chuyển đổi, các trường hợp hoạt động như blo ck để bạn có thể cần đặt {}. Bạn không cần phân bổ rõ ràng NSString nếu sử dụng ARC.

switch ([weatherCode intValue]) { 
    case 1: 
    { 
     //your code for case 1 
    } 
     break; 
    case 2: 
    { 
     //your code for case 2 
    }   
    break; 
} 
3

In (Objective-) C (++) các báo cáowhile(...) { ... }, for(...) { ... }, switch(...) { ...}, vv chứa một tuyên bố khối đơn (if (...) { ... } else { ... } chứa hai). Phạm vi của các tuyên bố trong một khối chỉ là khối đó và đó là lỗi để khai báo cùng một biến hai lần trong một khối.

Khối của switch chứa một số case ...:nhãn - nhãn không phân cách khối, chúng chỉ là điểm trong khối điều khiển luồng có thể chuyển đến. Điều này làm cho các câu lệnh switch trong C khác với một số ngôn ngữ khác mà mỗi nhánh là độc lập (vì hai khối trong một if/else độc lập trong C). A C switch chỉ là một "goto tính toán" thành một khối duy nhất. Đây là lý do tại sao câu lệnh break; tồn tại, mà không có luồng điều khiển chỉ tiếp tục từ một nhánh "nhánh" sang dòng tiếp theo.

Một hệ quả khác của việc này là các nhánh khác nhau không thể khai báo cùng tên biến, không giống như câu lệnh if/else.

Cuối cùng chỉ báo cáo và không tờ khai có thể được dán nhãn, và như là một case ...: là một hình thức của nhãn không thể có một tuyên bố ngay sau khi một - vì vậy bạn không thể bắt đầu một "chi nhánh" với một bản tuyên bố.

Nếu các biến bạn muốn khai báo trong nhánh chỉ được sử dụng trong nhánh đó (nếu chúng được khai báo ở một trong các khối if/else) thì bạn có thể giải quyết tất cả các vấn đề , { ... }, để biến nó thành một câu lệnh khối - các khối có thể được dán nhãn và có thể chứa các khai báo cục bộ. Ví dụ. cái gì đó dọc theo dòng:

switch (expr) 
{ 
    case 1: 
     { 
     NSString *var; 
     // use var 
     break; 
     } 

    case 2: 
     { 
     NSNumber *var; 
     // use var 
     break; 
     } 

    ... 
} 
// no var here 

Nếu bạn đang gán cho các biến mà bạn cần phải sử dụng sau khi switch sau đó bạn phải khai báo trước khi switch, như cơ thể của một switch là một khối và do đó một tuyên bố địa phương phạm vi. Ví dụ. cái gì đó dọc theo dòng:

NSString *var = nil; 
switch (expr) 
{ 
    case 1: 
     ... 
     var = ...; 
     break; 

    case 2: 
     ... 
     var = ...; 
     break; 

    ... 
} 
// use var here  

HTH

+0

Câu trả lời hoàn hảo, kỹ lưỡng. (bình chọn) –

Các vấn đề liên quan