112

Có cách nào để truyền các đối tượng trong object-c giống như cách các đối tượng được truyền trong VB.NET không?

Ví dụ, tôi đang cố gắng làm như sau:

// create the view controller for the selected item
FieldEditViewController *myEditController;
switch (selectedItemTypeID) {
    case 3:
        myEditController = [[SelectionListViewController alloc] init];
        myEditController.list = listOfItems;
        break;
    case 4:
        // set myEditController to a diff view controller
        break;
}

// load the view
[self.navigationController pushViewController:myEditController animated:YES];
[myEditController release]; 

Tuy nhiên, tôi đang gặp lỗi trình biên dịch do thuộc tính 'list' tồn tại trong lớp SelectionListViewControll nhưng không có trên FieldEditViewCont kiểm ngay cả khi SelectionListViewContaptor kế thừa từ FieldEditViewCont kiểm.

Điều này có ý nghĩa, nhưng có cách nào để truyền myEditControll thành SelectionListViewControll để tôi có thể truy cập vào thuộc tính 'list' không?

Ví dụ trong VB.NET tôi sẽ làm:

CType(myEditController, SelectionListViewController).list = listOfItems

Cảm ơn đã giúp đỡ!

|
204

Hãy nhớ rằng, Objective-C là siêu bộ của C, do đó, typecasting hoạt động giống như trong C:

myEditController = [[SelectionListViewController alloc] init];
((SelectionListViewController *)myEditController).list = listOfItems;
|
  • 1

    Hoặc "Hãy nhớ, Objective-C hoạt động giống như Java, chỉ cần nhớ thêm dấu sao vào các biến trỏ đến các đối tượng Obj-C."

    – Tạ Dương Anh 03:43:14 14/06/2010
  • 1

    Câu trả lời chính xác. Bạn có thể làm cho nó rõ ràng hơn một chút bằng cách chia nhỏ các diễn viên và phân công thành hai dòng.

    – Ngô Hoàng Anh 21:06:44 03/06/2014
  • 1

    Kiểu chữ trong Objective-C giống với C cũ hơn nhiều so với Java. Java che giấu phần lớn điều này từ người dùng, do đó lập luận rằng C vẫn nên được dạy thay vì Java là ngôn ngữ đầu tiên.

    – Trịnh Quang Duy 14:18:55 02/06/2016
11
((SelectionListViewController *)myEditController).list

Ví dụ khác:

int i = (int)19.5f; // (precision is lost)
id someObject = [NSMutableArray new]; // you don't need to cast id explicitly
|
  • 1

    Nói chung điều này là chính xác; bạn không cần truyền id trong biểu thức tin nhắn. Nhưng khi sử dụng cú pháp dấu chấm để truy cập và thiết lập các thuộc tính, bạn phải sử dụng một loại cụ thể, không chỉ id, để trình biên dịch biết cách gọi phương thức nào để thực sự tạo ra. (Nó có thể khác nhau đối với các thuộc tính có cùng tên.)

    – Phạm Thùy Anh 04:27:57 29/03/2009
7

Việc đánh máy trong Objective-C rất dễ dàng như:

NSArray *threeViews = @[[UIView new], [UIView new], [UIView new]];
UIView *firstView = (UIView *)threeViews[0];

Tuy nhiên, điều gì xảy ra nếu đối tượng đầu tiên không có UIViewvà bạn cố gắng sử dụng nó:

NSArray *threeViews = @[[NSNumber new], [UIView new], [UIView new]];
UIView *firstView = (UIView *)threeViews[0];
CGRect firstViewFrame = firstView.frame; // CRASH!

Nó sẽ sụp đổ. Và thật dễ dàng để tìm thấy sự cố như vậy cho trường hợp này, nhưng nếu những dòng đó ở các lớp khác nhau và dòng thứ ba chỉ được thực hiện một lần trong 100 trường hợp. Tôi đặt cược khách hàng của bạn tìm thấy sự cố này, không phải bạn! Một giải pháp hợp lý là sụp đổ sớm , như thế này:

UIView *firstView = (UIView *)threeViews[0];
NSAssert([firstView isKindOfClass:[UIView class]], @"firstView is not UIView");

Những xác nhận đó trông không đẹp lắm, vì vậy chúng tôi có thể cải thiện chúng với danh mục tiện dụng này:

@interface NSObject (TypecastWithAssertion)
+ (instancetype)typecastWithAssertion:(id)object;
@end


@implementation NSObject (TypecastWithAssertion)

+ (instancetype)typecastWithAssertion:(id)object {
    if (object != nil)
        NSAssert([object isKindOfClass:[self class]], @"Object %@ is not kind of class %@", object, NSStringFromClass([self class]));
    return object;
}

@end

Điều này tốt hơn nhiều :

UIView *firstView = [UIView typecastWithAssertion:[threeViews[0]];

PS Đối với các bộ sưu tập loại an toàn Xcode 7 có nhiều hơn so với typecasting - genericics

|
4

Chắc chắn, cú pháp hoàn toàn giống với C - NewObj* pNew = (NewObj*)oldObj;

Trong tình huống này, bạn có thể xem xét việc cung cấp danh sách này như một tham số cho hàm tạo, đại loại như:

// SelectionListViewController
-(id) initWith:(SomeListClass*)anItemList
{
  self = [super init];

  if ( self ) {
    [self setList: anItemList];
  }

  return self;
}

Sau đó sử dụng nó như thế này:

myEditController = [[SelectionListViewController alloc] initWith: listOfItems];
|
0

Truyền để đưa vào cũng quan trọng như truyền để loại trừ cho lập trình viên C ++. Truyền kiểu không giống như với RTTI theo nghĩa là bạn có thể truyền đối tượng cho bất kỳ loại nào và con trỏ kết quả sẽ không bằng không.

|

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.