2009-03-27 17 views
103

Nesneleri VB.NET'te nesnelerin nasıl yayınlandığı gibi nesnelere dökmenin bir yolu var mı? Örneğin Nesne-C'deki bir nesneyi nasıl atarsınız?

, şu yapmaya çalışıyorum:

'liste' özelliği SelectionListViewController devraldığı halde FieldEditViewController üzerinde SelectionListViewController sınıfında var ama beri bir derleyici hatası alıyorum Ancak
// 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]; 

FieldEditViewController.

Bu mantıklı ama ben 'liste' özelliğini erişebilmesi için bir SelectionListViewController için myEditController döküm için bir yol var mı?

VB.NET Örneğin yapardım: Yardım için

CType(myEditController, SelectionListViewController).list = listOfItems 

Teşekkür!

+0

Bu sayfada "döküm" araması yapın: http://en.wikipedia.org/wiki/Objective-C –

cevap

186

Objective-C C kümesidir unutmayın, bu nedenle C olduğu gibi tiplemeleri çalışır:

myEditController = [[SelectionListViewController alloc] init]; 
((SelectionListViewController *)myEditController).list = listOfItems; 
+20

Veya "Unutmayın, Objective-C çalışır Java gibi, Obj-C nesnelerine işaret eden değişkenlere yıldız işaretleri eklemeyi unutmayın. " –

+1

Harika cevap. Oyunculuğu ve atamayı iki çizgiye ayırarak biraz daha netleştirebilirsiniz. –

+0

Objective-C’de Typecasting, Java’dan çok daha eski C’ye benzer. Java, bunun birçoğunu kullanıcıdan gizler, dolayısıyla C'nin hala bir ilk dil olarak Java'dan ziyade öğretilmesi gereken argümanlar. – csmith

7
((SelectionListViewController *)myEditController).list 

fazla örnek:

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

Genel olarak bu doğrudur; İleti ifadelerinde kimlik girmenize gerek yoktur. Ancak, özelliklere erişmek ve ayarlamak için nokta sözdizimini kullanırken, sadece id değil, bir beton türü kullanmalısınız, böylece derleyici gerçekte hangi yöntem çağrışımının üretileceğini bilir. (Aynı adı taşıyan özellikler için farklılık gösterebilir.) –

4

Tabii, sözdizimi tam olarak C ile aynı - Eğer isteyebilirsiniz NewObj* pNew = (NewObj*)oldObj;

Bu durumda bir parametre olarak bu listeyi temin düşünün Yapıcı, gibi bir şey:

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

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

    return self; 
} 

Sonra bu gibi kullanmak:

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

eklenmesi için Döküm bir C++ programcısı için dışlama döküm kadar önemlidir. Tip döküm, bir nesneyi herhangi bir türe atabileceğiniz ve sonuçta işaretçinin sıfır olmayacağı için RTTI ile aynı değildir.

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

Ancak gelindiğinde birinci nesne UIView değilse ve bunu kullanmayı deneyin:

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

Bu çökme gibi Objective-C

5

tiplemeleri kolaydır. Ve bu durum için böyle bir çökme bulmak kolay, ama bu satırlar farklı sınıflar halinde ise ve üçüncü hat 100 vakada sadece bir kez yürütülürse. Bahse girerim müşterilerinizin bu çöküşü bulması, siz değil! İnandırıcı bir çözüm bu gibi crash early şudur:

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

olanlar iddialar çok güzel görünmüyor, bu yüzden bu kullanışlı kategori ile onları geliştirmek:

@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 

Bu çok daha iyidir:

( )Tahsilatlar için, Xcode 7 güvenlik tipinde, tipografik verilerden çok daha iyi bir değer var - generics
İlgili konular