Objective-C에서 오브젝트를 캐스팅하는 방법
오브젝트 c에서 오브젝트를 캐스팅하는 방법은 VB에서 오브젝트를 캐스팅하는 방법과 매우 유사합니까?인터넷?
예를 들어, 다음을 수행하려고 합니다.
// 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];
단, SelectionListViewController가 FieldEditViewController에서 상속받은 경우에도 SelectionListViewController 클래스에는 'list' 속성이 존재하지만 FieldEditViewController에는 존재하지 않기 때문에 컴파일러 오류가 발생합니다.
이것은 타당하지만, myEditController를 SelectionListViewController에 캐스팅하여 'list' 속성에 액세스할 수 있는 방법이 있습니까?
예를 들어 VB에 있습니다.NET:
CType(myEditController, SelectionListViewController).list = listOfItems
도와줘서 고마워요!
Objective-C는 C의 슈퍼셋이므로 Typecasting은 C에서처럼 작동합니다.
myEditController = [[SelectionListViewController alloc] init];
((SelectionListViewController *)myEditController).list = listOfItems;
Objective-C의 타이핑은 다음과 같이 간단합니다.
NSArray *threeViews = @[[UIView new], [UIView new], [UIView new]];
UIView *firstView = (UIView *)threeViews[0];
단, 첫 번째 오브젝트가 이 오브젝트를 사용하지 않을 경우UIView
그것을 사용하려고 합니다.
NSArray *threeViews = @[[NSNumber new], [UIView new], [UIView new]];
UIView *firstView = (UIView *)threeViews[0];
CGRect firstViewFrame = firstView.frame; // CRASH!
충돌합니다.이 경우 이러한 크래시를 쉽게 발견할 수 있지만, 이러한 행이 서로 다른 클래스에 속하고 세 번째 행이 100건 중 한 번만 실행된다면 어떻게 될까요?고객님이 이 추락을 발견하셨을 거예요, 당신이 아니라요!그럴듯한 해결책은 다음과 같이 일찍 크래시하는 것입니다.
UIView *firstView = (UIView *)threeViews[0];
NSAssert([firstView isKindOfClass:[UIView class]], @"firstView is not UIView");
이러한 주장은 그다지 좋지 않아 보이기 때문에 다음과 같은 편리한 카테고리로 개선할 수 있습니다.
@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
이것이 훨씬 낫다.
UIView *firstView = [UIView typecastWithAssertion:[threeViews[0]];
추신. 수집 유형의 경우 안전 Xcode 7이 타이프캐스팅 - 제네릭보다 훨씬 우수합니다.
((SelectionListViewController *)myEditController).list
기타 예:
int i = (int)19.5f; // (precision is lost)
id someObject = [NSMutableArray new]; // you don't need to cast id explicitly
물론 구문은 C - 와 완전히 동일합니다.NewObj* pNew = (NewObj*)oldObj;
이 경우 이 목록을 생성자에 매개 변수로 제공하는 것을 고려할 수 있습니다. 예를 들어 다음과 같습니다.
// SelectionListViewController
-(id) initWith:(SomeListClass*)anItemList
{
self = [super init];
if ( self ) {
[self setList: anItemList];
}
return self;
}
그런 다음 다음과 같이 사용합니다.
myEditController = [[SelectionListViewController alloc] initWith: listOfItems];
C++ 프로그래머에게 포함을 위한 캐스팅은 제외를 위한 캐스팅만큼이나 중요합니다.타입 캐스팅은 오브젝트를 임의의 타입으로 캐스팅할 수 있어 결과적으로 포인터가 0이 되지 않는다는 점에서 RTI와 동일하지 않습니다.
언급URL : https://stackoverflow.com/questions/690748/how-to-cast-an-object-in-objective-c
'programing' 카테고리의 다른 글
Midi 컨트롤러를 통한 Excel 제어 (0) | 2023.04.11 |
---|---|
git commit 메시지에서 과거 시제를 사용해야 합니까, 아니면 현재 시제를 사용해야 합니까? (0) | 2023.04.11 |
Windows용 Git: .bashrc 또는 Git Bash 쉘용 동등한 구성 파일 (0) | 2023.04.11 |
Excel에서 ISO8601 날짜/시간(타임존 포함) 해석 (0) | 2023.04.11 |
npm 5에 의해 작성된 package-lock.json 파일을 커밋해야 합니까? (0) | 2023.04.11 |